8.6.2 MyISAM 테이블의 대량 데이터로드
이러한 성능 팁 섹션 8.2.2.1 "INSERT 문 속도" 의 빠른 삽입 일반적인 지침을 보완하는 것입니다.
여러 클라이언트가 대량의 행을 삽입 할 경우 성능을 향상하려면
INSERT DELAYED명령문을 사용합니다. 섹션 13.2.5.2 "INSERT DELAYED 구문" 을 참조하십시오. 이 기법은MyISAM및 기타 일부 스토리지 엔진은 유효하지만,InnoDB는 작동하지 않습니다.참고MySQL 5.6.6 현재
INSERT DELAYED는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신INSERT(DELAYED를 붙이지 않는)을 사용하십시오.MyISAM테이블에서는 데이터 파일의 중간에 삭제 된 행이없는 경우SELECT문 실행 중에 동시에 동시 삽입을 사용하여 행을 추가 할 수 있습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.약간의 추가 작업으로
MyISAM테이블에 많은 인덱스가 있으면 테이블의LOAD DATA INFILE의 실행을 더욱 빠르게 할 수 있습니다. 다음 단계를 사용합니다.FLUSH TABLES명령문 또는 mysqladmin flush-tables 명령을 실행합니다.테이블 인덱스의 모든 사용을 삭제하려면 myisamchk --keys-used = 0 -rq
/path/to/db/tbl_name을 사용합니다.LOAD DATA INFILE을 사용하여 테이블에 데이터를 삽입합니다. 이것은 인덱스를 업데이트하지 않기 때문에 매우 빠릅니다.향후 테이블에서 읽기만하는 경우 myisampack를 사용하여 그것을 압축합니다. 섹션 15.2.3.3 "압축 테이블의 특징" 을 참조하십시오.
myisamchk -rq
/path/to/db/tbl_name을 사용하여 인덱스를 다시 작성합니다. 따라서 디스크에 쓰기 전에 메모리에 인덱스 트리를 만들고 대량의 디스크 검색을 피하기 위해LOAD DATA INFILE시 인덱스의 업데이트보다 훨씬 빨라집니다. 결과의 인덱스 트리는 완전하게 밸런스도 잡혀 있습니다.FLUSH TABLES명령문 또는 mysqladmin flush-tables 명령을 실행합니다.
데이터를 삽입하는
MyISAM테이블이 비어있는 경우는LOAD DATA INFILE은 앞서의 최적화를 자동으로 실행합니다. 자동 최적화 및 명시 적으로 절차를 사용할 수의 주요 차이점은 서버에LOAD DATA INFILE명령문을 실행할 때 인덱스를 다시 작성에 할당하도록 할 수있는 양보다 myisamchk는 인덱싱을 위해 더 많은 임시 메모리를 할당 할 수있는 것입니다.myisamchk 대신 다음 문을 사용하여
MyISAM테이블의 고유하지 않은 인덱스를 활성화 또는 비활성화 할 수 있습니다. 이러한 문을 사용하면FLUSH TABLE작업을 생략 할 수 있습니다.ALTER TABLE
tbl_nameDISABLE KEYS; ALTER TABLEtbl_nameENABLE KEYS;비 트랜잭션 테이블에 여러 문에서 실행되는
INSERT작업 속도는 테이블을 잠급니다.LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23) (2,34) (4,33); INSERT INTO a VALUES (8,26) (6,29); ... UNLOCK TABLES;
이것은 모든
INSERT문이 완료되면 인덱스 버퍼가 1 회만 디스크에 플래시되기 때문에 성능에 이점이 있습니다. 일반적으로INSERT문의 수와 같다, 인덱스 버퍼 플러시가 이루어집니다. 모든 행을 하나의INSERT삽입 할 수있는 경우는 명시적인 잠금 문은 필요하지 않습니다.잠금은 여러 연결 테스트의 총 시간도 단축되지만 개별 연결이 잠금을 대기하는 그 최대 대기 시간은 길어질 수 있습니다. 다음과 같이 5 개의 클라이언트가 동시에 삽입의 실행을 시도합니다.
연결 1은 1000 번의 삽입을 실행합니다
연결 2, 3 및 4는 1 회 삽입을 실행합니다
연결 5는 1000 번 삽입을 실행합니다
잠금을 사용하지 않으면 연결 2, 3 및 4는 1과 5 전에 끝납니다. 잠금을 사용하면 연결 2, 3 및 4는 1 또는 5의 전에 종료하지 않을 가능성이 있습니다 만, 총 시간은 약 40 % 고속화하는 것입니다.
MySQL은
INSERT,UPDATE및DELETE작업은 매우 빠르지 만 약 5 회 이상 연속 삽입이나 업데이트를 수행하는 모든 작업 주위에 잠금을 추가하여 전체 성능을 향상시킬 수 있습니다. 상당히 많은 연속적인 삽입을 실행하는 경우LOCK TABLES뒤에 가끔 (1,000 라인 정도마다)UNLOCK TABLES를 실행하고 다른 스레드의 테이블에 대한 액세스를 허용 할 수 있습니다. 따라서도 성능 향상을 얻을 수 있습니다.위의 전략을 사용하더라도 데이터의로드에는
LOAD DATA INFILE보다INSERT가 훨씬 느립니다.MyISAM테이블의LOAD DATA INFILE과INSERT모두에 대해 성능을 향상하려면key_buffer_size시스템 변수를 늘려 키 캐시를 확장합니다. 섹션 8.11.2 "서버 파라미터의 튜닝」 을 참조하십시오.