2011-05-09 7 views
0

저는 개발자이며 많은 양의 레코드가있는 테이블을 관리하는 중 문제가 있습니다.대용량 레코드 테이블 삽입 문제 Mysql

5 ~ 6 개의 열과 약 4,000,000 ~ 5,000,000 개의 행을 가진 기본 테이블 (표 A)의 데이터를 채우기 위해 cron 작업을 실행하고 있고이 테이블의 다른 테이블과 데이터를 계속 작성하면 시간이 지남에 따라 증가한다.

표 A 원시 데이터를 포함하고 내 출력 테이블은

내 크론 스크립트는 다음 표 B에 데이터를 자릅니다 선택 쿼리 위

TRUNCATE TABLE_B; 

INSERT INTO TABLE_B (field1, field2) 
SELECT DISTINCT(t1.field2), t2.field2 
FROM TABLE_A AS t1 
INNER JOIN TABLE_A t2 ON t2.field1=t1.field1 
WHERE t1.field2 <> t2.field2 
GROUP BY t1.field2, t2.field2 
ORDER BY COUNT(t1.field2) DESC; 

약 1,50,000을 생산하는 선택 쿼리를 사용하여 데이터를 삽입 표 B입니다 2,00,000 행

에 지금은 표 B를 채우는 데 너무 많은 시간이 걸리고 내 응용 프로그램은 선택 쿼리가 실패 표 B에 액세스하려고 한편 경우

설명하면서 쿼리 결과 다음

'1','PRIMARY','T1','ALL','field1_index',NULL,NULL,NULL,'431743','Using temporary;Using filesort' 
'1','PRIMARY','T2','ref','field1_index','field1_index','767','DBNAME.T1.field1','1','Using where' 

사람이 프로세스를 개선 도와, 또는 나에게 위의 과정에 대한 대안을 안내 주시겠습니까?

감사

Suketu

+0

이러한 유형의 질문이 제기되었습니다. http://stackoverflow.com/questions/2838828/bulk-insert-problem-in-mysql – Ankit

+0

EXPLAIN 구문을 유용하게 사용하려면 두 테이블에 대해 'SHOW CREATE TABLES'출력을 포함하십시오. –

+0

'TABLE_A' ( 'id'의 INT (11) 부호 NOT NULL AUTO_INCREMENT, 'field1'의 VARCHAR (255) NULL NOT, 'field2'의 VARCHAR (255) NULL NOT TABLE을 만들 code', 'count_field3'의 INT (10) 부호 NULL NOT, 'field_4'의 INT (10) 부호 NOT NULL, PRIMARY KEY ('id'), KEY'field2_index' ('field2'), KEY'field1_index' ('field1') ) ENGINE = MyISAM AUTO_INCREMENT = 435692 DEFAULT CHARSET = utf8'code' – Suketu

답변

0

당신은 저장된 프로 시저에서 전체 과정을 수행해야합니다.

큰 테이블을 자르지 마십시오. 다음과 같이하십시오.

  1. TableB 구조를 TableB_Copy로 복사하십시오.
  2. DROP TABLEB.
  3. 이름 바꾸기 TableB_Copy는 TableB의에 인덱스를 생성 TableB의
  4. 에 삽입에게
  5. TableB의
  6. 에 TableA의에서 데이터를
  7. 안 인덱스를 TableB의합니다.
+0

복사본을 만들고 그것을 채운 다음, 'RENAME TABLE tableB TO tableB_old, tableB_new TO tableB'을 사용하여 더 깨끗하게 만들지는 않습니까? –

+0

안녕하세요, 나를 위해 일했습니다! – Suketu

0

내보기에 따르면이 솔루션은 다음과 같이 될 것이다 : ": \ TEMP의 \의 DATA1.SQL C"와 같은 인스턴스 파일의 경우

SELECT 
    DISTINCT(t1.field2), t2.field2 
    FROM 
     TABLE_A AS t1 
    INNER JOIN 
     TABLE_A t2 ON 
     t2.field1=t1.field1 
    WHERE 
     t1.field2 <> t2.field2 
    GROUP BY 
     t1.field2, t2.field2 
    ORDER BY 
     COUNT(t1.field2) 
    DESC INTO OUTPUT "PATH-TO-FILE"; 

. 이 쿼리에서는 테이블에 삽입 할 TAB 구분 기호로 간단한 새 파일을 만듭니다. 이제 테이블로 데이터를 가져 오는 방법.

LOAD DATA 
    "PATH-TO-FILE" 
INTO TABLE 
    table_name 

이 쿼리를 사용하면 데이터가 삽입되고 다른 한편으로는 데이터를 삽입 할 테이블을 사용할 수 있습니다.