2009-12-28 2 views
2

약 700 만 행의 테이블이 있습니다. 하루에 한 번이 테이블에 약 200,000 개의 새 행을 대량으로 가져와야합니다. 이렇게하려면 먼저 테이블에서 키를 비활성화하고 LOAD DATA INFILE을 사용한 다음 테이블의 키를 다시 활성화해야합니다.데이터 Infile + 사용/사용 안 함 성능 성능

내가 겪고있는 문제는 ALTER TABLE my_table ENABLE KEYS 문입니다.
완료하는 데 약 15 분이 걸립니다. myisam_sort_buffer_size을 늘려 성능을 향상 시키려고하지만 도움이되지 않습니다. 다른 아이디어?

답변

3

mysqladmin 및 myisamchk와 같은 외부 MySQL 도구를 사용해 볼 수 있습니다. 그들은 정규 설치를 위해/usr/local/mysql/bin 경로에 있습니다.

MySQL의 웹 사이트에서 솔루션 경로 :

  • 가 FLUSH TABLES 명령문 또는 mysqladmin flush-테이블 명령을 실행합니다.

  • myisamchk --keys-used = 0 -rq/path/to/db/tbl_name을 사용하십시오. 이렇게하면 테이블에 대한 인덱스 사용이 모두 으로 제거됩니다.

  • LOAD DATA INFILE을 사용하여 테이블에 데이터를 삽입하십시오. 이것은 인덱스를 업데이트하지 않으므로 매우 빠릅니다.

  • 앞으로 테이블을 읽으려는 경우 myisampack을 사용하여 압축하십시오. 13.4.3.3 절, "압축 테이블 특성"을 참조하십시오.

  • myisamchk -rq/path/to/db/tbl_name을 사용하여 색인을 다시 만듭니다. 이것은 디스크에 쓰기 전에 메모리에 인덱스 트리를 만듭니다. 많은 디스크 검색을 피하기 때문에 LOAD DATA INFILE 동안 인덱스를 업데이트하는 것이 훨씬 빠릅니다. 결과적으로 인덱스 트리도 완벽하게 균형을 이룹니다.

  • FLUSH TABLES 문 또는 mysqladmin flush-tables 명령을 실행하십시오.

mysql official documents

+0

을 발행하십시오. myisamchk -rqa/path/to/db/tbl_name 옵션이 올바르게 작동합니다. –

+0

또한' ALTER TABLE

DISABLE KEYS' (와'... ENABLE KEYS')는'myisamchk' 명령을 사용하는 것과 같습니다 (차이가 있다면 약간 혼란스럽고 나머지는 MySQL 문서를 읽습니다) –

1

당신이 잠긴 테이블로 인한 다운 타임을 최소화 할 것을 가정 할 때, 나는 표준 절차가 테이블을 복제하거나 해제하지 않고 (클론에 삽입을 수행하는 것입니다 믿습니다 키)를 사용하고 일단 완료되면 테이블의 인덱스에 대해 카디널리티 값이 업데이트되지 않으면 DROP TABLE tableName;RENAME TABLE tableClone TO tableName