Loading...
MySQL 9.5 Reference Manual 9.5의 10.6.2 Bulk Data Loading for MyISAM Tables의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
다음 성능 팁은 Section 10.2.5.1, “Optimizing INSERT Statements”에 있는 빠른 insert를 위한 일반적인 지침을 보완합니다.
MyISAM 테이블의 경우, 데이터 파일 중간에 삭제된 row가 없다면, SELECT 구문이 실행되는 동안 동시에 row를 추가하기 위해 동시 insert를 사용할 수 있습니다. Section 10.11.3, “Concurrent Inserts”를 참조하십시오.
약간의 추가 작업을 통해, 많은 인덱스가 있는 MyISAM 테이블에 대해 LOAD DATA를 훨씬 더 빠르게 실행할 수 있습니다. 다음 절차를 사용하십시오:
FLUSH TABLES 구문을 실행하거나 mysqladmin flush-tables 명령을 실행합니다.
myisamchk --keys-used=0 -rq /path/to/db/tbl_name를 사용하여 해당 테이블에 대해 모든 인덱스 사용을 제거합니다.
LOAD DATA로 테이블에 데이터를 insert합니다. 이 작업은 어떤 인덱스도 업데이트하지 않으므로 매우 빠릅니다.
향후 해당 테이블을 읽기만 할 예정이라면, myisampack을 사용하여 테이블을 압축합니다. Section 18.2.3.3, “Compressed Table Characteristics”를 참조하십시오.
myisamchk -rq /path/to/db/tbl_name로 인덱스를 다시 생성합니다. 이 방법은 인덱스 트리를 디스크에 쓰기 전에 메모리에서 생성하기 때문에, LOAD DATA 동안 인덱스를 업데이트하는 것보다 훨씬 빠릅니다. 이는 많은 디스크 시크를 피하기 때문입니다. 또한 결과 인덱스 트리는 완벽하게 균형 잡혀 있습니다.
FLUSH TABLES 구문을 실행하거나 mysqladmin flush-tables 명령을 실행합니다.
LOAD DATA는 데이터를 insert하는 MyISAM 테이블이 비어 있는 경우, 앞의 최적화를 자동으로 수행합니다. 자동 최적화와 위 절차를 명시적으로 사용하는 것의 주된 차이점은, 서버가 LOAD DATA 구문을 실행할 때 인덱스 재생성을 위해 할당하길 원하는 양보다, myisamchk에게 인덱스 생성용 임시 메모리를 훨씬 더 많이 할당하도록 할 수 있다는 점입니다.
또한, myisamchk 대신 다음 구문들을 사용하여 MyISAM 테이블의 비고유 인덱스를 비활성화하거나 활성화할 수 있습니다. 이러한 구문을 사용하는 경우, FLUSH TABLES 작업을 건너뛸 수 있습니다:
1ALTER TABLE tbl_name DISABLE KEYS; 2ALTER TABLE tbl_name ENABLE KEYS;
INSERT 작업을 빠르게 하기 위해, 테이블에 lock을 설정하십시오:1LOCK TABLES a WRITE; 2INSERT INTO a VALUES (1,23),(2,34),(4,33); 3INSERT INTO a VALUES (8,26),(6,29); 4... 5UNLOCK TABLES;
이 방법은, 모든 INSERT 구문이 완료된 후에만 인덱스 버퍼가 디스크로 flush되기 때문에 성능에 도움이 됩니다. 일반적으로는 INSERT 구문 수만큼 인덱스 버퍼 flush가 발생합니다.
모든 row를 하나의 INSERT로 insert할 수 있다면, 명시적인 locking 구문은 필요하지 않습니다.
Locking은 여러 연결에 대한 테스트의 총 소요 시간을 줄여주지만, lock을 기다려야 하므로 개별 연결의 최대 대기 시간은 증가할 수 있습니다. 다음과 같이 다섯 개의 클라이언트가 동시에 insert를 수행하려 한다고 가정해 봅니다:
Lock을 사용하지 않으면, connection 2, 3, 4가 1과 5보다 먼저 종료됩니다. Lock을 사용하면, connection 2, 3, 4가 1이나 5보다 먼저 종료되지 않을 가능성이 크지만, 전체 시간은 약 40% 정도 더 빨라야 합니다.
INSERT, UPDATE, DELETE 작업은 MySQL에서 매우 빠르지만, 약 다섯 번 이상의 연속 insert나 update를 수행하는 모든 작업 주위에 lock을 추가함으로써 전체적인 성능을 더 향상시킬 수 있습니다.
매우 많은 연속 insert를 수행하는 경우, 때때로 (예: 1,000 row마다 한 번씩) LOCK TABLES와 이어지는 UNLOCK TABLES를 실행하여 다른 스레드가 테이블에 접근할 수 있도록 할 수 있습니다. 이렇게 해도 여전히 상당한 성능 향상을 얻을 수 있습니다.
INSERT는 방금 설명한 전략을 사용하더라도, 데이터를 적재하는 데 있어서는 LOAD DATA보다 여전히 훨씬 느립니다.
MyISAM 테이블에 대해 LOAD DATA와 INSERT 모두의 성능을 높이려면, key_buffer_size 시스템 변수를 증가시켜 키 캐시를 키우십시오. Section 7.1.1, “Configuring the Server”를 참조하십시오.10.6.1 Optimizing MyISAM Queries
10.6.3 Optimizing REPAIR TABLE Statements