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_name
DISABLE KEYS; ALTER TABLEtbl_name
ENABLE 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 "서버 파라미터의 튜닝」 을 참조하십시오.