인덱스 생성 빠르게 하는 방법(2)
페이지 정보
작성자 오원장쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 4,156회 작성일 12-03-05 22:39본문
레코드 삽입의 시간 구성의 개요는 다음과 같습니다.
-
접속:(3)
-
서버에의 쿼리의 송신:(2)
-
쿼리의 해석:(2)
-
레코드 삽입:(1 x 레코드 사이즈)
-
인덱스 삽입:(1 x 인덱스수)
-
클로우즈:(1)
여기에 나타낸 수치는 , 시간 전체를 비례적으로 배분한 것입니다. 테이블을 여는 초기 오바헷드는 산입되고 있지 않습니다 (이것은 동시 실행 쿼리의 각각으로 1 회 실행됩니다 ).
테이블의 사이즈에 의해 대수 N 의 분 만큼 인덱스 삽입의 속도가 저하합니다 (B 트리).
삽입의 속도를 올리는 방법
-
1 개의 클라이언트로부터 동시에 다수의 레코드를 삽입하는 경우는 다양한
INSERT
스테이트먼트를 사용한다. 이것으로 독립한INSERT
스테이트먼트의 사용시와 비교해 큰폭으로 (경우에 따라서는 수배) 속도가 오른다. 하늘이 아닌 테이블에 데이터를 추가하는 경우는 , 한층 더 속도를 올리기 위해서(때문에)bulk_insert_buffer_size
변수를 조정한다. See 항4.6.8.4. 「SHOW VARIABLES
」. -
다른 복수의 클라이언트로부터 대량의 레코드를 삽입하는 경우는 ,
INSERT DELAYED
스테이트먼트를 사용하면(자) 속도를 올릴 수가 있다. See 항6.4.3. 「INSERT
구문」. -
MyISAM
테이블에서는 , 테이블에 삭제된 레코드가 없는 경우 ,SELECT
의 실행과 동시에 레코드를 삽입할 수 있는 것에 주의한다. -
텍스트 파일로부터 테이블을 로드하는 경우는
LOAD DATA INFILE
을 사용한다. 통상 , 이것은INSERT
스테이트먼트를 다수 사용하는 경우와 비교해 ,20 배속도가 오른다. See 항6.4.8. 「LOAD DATA INFILE
구문」. -
테이블에 인덱스가 다수 있는 경우 , 조작을 조금 추가하는 것만으로
LOAD DATA INFILE
의 실행 속도를 한층 더 올릴 수가 있다. 이하의 순서를 사용한다.-
CREATE TABLE
(을)를 사용해 , 테이블을 작성한다.mysql
(이)나 Perl-DBI 등 을 사용한다. -
FLUSH TABLES
스테이트먼트 또는 쉘 커멘드mysqladmin flush-tables
를 실행한다. -
myisamchk --keys-used=0 -rq /path/to/db/tbl_name
(을)를 사용한다. 이것으로 테이블에서 모든 인덱스의 사용이 삭제된다. -
LOAD DATA INFILE
(을)를 사용해 , 테이블에 데이터를 삽입한다. 이것은 인덱스를 완전히 갱신하지 않기 때문에 , 매우 고속으로 된다. -
테이블을 읽어내 전용으로 하는 경우는 ,
myisampack
을 실행해 테이블을 작게 한다. See 항7.1.2.3. 「압축 테이블의 특성」. -
myisamchk -r -q /path/to/db/tbl_name
(을)를 사용해 인덱스를 작성 다시 한다. 이것은 , 디스크에 기입하기 전에 메모리에 인덱스 트리를 작성해 , 디스크 시크를 회피하기 위해(때문에) 매우 고속으로 된다. 생성된 인덱스 트리는 완전하게 밸런스가 놓치고 있다. -
FLUSH TABLES
스테이트먼트 또는 쉘 커멘드mysqladmin flush-tables
를 실행한다.
하늘의 테이블에 삽입하는 경우는 ,
LOAD DATA INFILE
은 상기의 최적화를 실행합니다. 상기 순서와의 주된 차이점은 ,myisamchk
에 인덱스 작성용의 텐포라리메모리를 큰폭으로 할당할 수가 있는 점입니다.MySQL 4.0 이후는 ,
myisamchk --keys-used=0 -rq /path/to/db/tbl_name
대신에ALTER TABLE tbl_name DISABLE KEYS
를 , 또myisamchk -r -q /path/to/db/tbl_name
대신에ALTER TABLE tbl_name ENABLE KEYS
를 사용할 수도 있습니다. 이와 같이 하면(자) ,FLUSH TABLES
스텝을 스킵 할 수도 있습니다. -
-
복수 스테이트먼트를 사용해 실행되는 삽입의 속도를 , 테이블을 잠그는 것에 의해 올릴 수가 있다.
mysql>
LOCK TABLES a WRITE;
mysql>INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql>INSERT INTO a VALUES (8,26),(6,29);
mysql>UNLOCK TABLES;
주된 속도의 차이점은 , 모든
INSERT
스테이트먼트의 완료 후에 index buffer가 1 회만 디스크에 플래시 되는 것이다. 통상은 ,INSERT
스테이트먼트의 수와 같다, index buffer의 플래시를 한다. 모든 레코드를 1 개의 스테이트먼트로 삽입할 수 있는 경우는 락의 필요가 없다.트랜잭션(transaction) 테이블의 경우는 ,
LOCK TABLES
은 아니게BEGIN/COMMIT
를 사용해 속도의 개선을 꾀한다.락은 복수의 동시 접속 테스트의 합계 시간도 단축하지만 , 일부의 thread의 최대 대기 시간은 길어진다 (락 시에 대기하기 위해(때문에) ). 다음의 예를 참조해 주세요.
thread 1 는 1000 레코드를 인서트 thread 2, 3, 4 는 1 레코드를 인서트 thread 5 는 1000 레코드를 인서트
락을 사용하지 않는 경우 ,2,3,4 는 1 과 5 의 전에 종료한다. 락을 사용했을 경우는 ,2,3,4 는 1 과 5 의 전에는 종료하지 않는 확률이 높아지지만 , 합계 시간은 약 40% 단축된다.
MySQL 그럼 ,
INSERT
,UPDATE
, 및DELETE
의 연산이 매우 빠르기 때문에 , 약 5 개보다 많은 삽입이나 1 레코드 갱신하기 전에 락을 추가하면(자) 종합적인 퍼포먼스를 개선할 수 있다. 1 행으로 매우 다수의 삽입을 실행하는 경우는 , 가끔 ( 약 1,000 레코드마다)LOCK TABLES
에UNLOCK TABLES
를 계속해 실행해 , 다른 thread로부터의 테이블에의 액세스를 가능하게 할 수가 있다. 이것이라도 파포만의 증가를 얻을 수 있다.말할 필요도 없이 , 데이터의 로드에는
LOAD DATA INFILE
쪽 이 큰폭으로 고속으로 있다.
LOAD DATA INFILE
(와)과 INSERT
의 양쪽 모두의 속도를 한층 더 개선하려면 , 키 버퍼를 확장합니다. See 항5.5.2. 「서버 파라미터의 튜닝」.
댓글목록
등록된 댓글이 없습니다.