웹프로그래밍

Global It Leader!!


MySql


 
 

인덱스 생성 빠르게 하는 방법(2)

페이지 정보

작성자 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 4,059회 작성일 12-03-05 22:39

본문

5.2.10. INSERT 쿼리의 속도

레코드 삽입의 시간 구성의 개요는 다음과 같습니다.

  • 접속:(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 의 실행 속도를 한층 더 올릴 수가 있다. 이하의 순서를 사용한다.

    1. CREATE TABLE (을)를 사용해 , 테이블을 작성한다. mysql (이)나 Perl-DBI 등 을 사용한다.

    2. FLUSH TABLES 스테이트먼트 또는 쉘 커멘드 mysqladmin flush-tables 를 실행한다.

    3. myisamchk --keys-used=0 -rq /path/to/db/tbl_name (을)를 사용한다. 이것으로 테이블에서 모든 인덱스의 사용이 삭제된다.

    4. LOAD DATA INFILE (을)를 사용해 , 테이블에 데이터를 삽입한다. 이것은 인덱스를 완전히 갱신하지 않기 때문에 , 매우 고속으로 된다.

    5. 테이블을 읽어내 전용으로 하는 경우는 ,myisampack 을 실행해 테이블을 작게 한다. See 항7.1.2.3. 「압축 테이블의 특성」.

    6. myisamchk -r -q /path/to/db/tbl_name (을)를 사용해 인덱스를 작성 다시 한다. 이것은 , 디스크에 기입하기 전에 메모리에 인덱스 트리를 작성해 , 디스크 시크를 회피하기 위해(때문에) 매우 고속으로 된다. 생성된 인덱스 트리는 완전하게 밸런스가 놓치고 있다.

    7. 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 TABLESUNLOCK TABLES 를 계속해 실행해 , 다른 thread로부터의 테이블에의 액세스를 가능하게 할 수가 있다. 이것이라도 파포만의 증가를 얻을 수 있다.

    말할 필요도 없이 , 데이터의 로드에는 LOAD DATA INFILE 쪽 이 큰폭으로 고속으로 있다.

LOAD DATA INFILE (와)과 INSERT 의 양쪽 모두의 속도를 한층 더 개선하려면 , 키 버퍼를 확장합니다. See 항5.5.2. 「서버 파라미터의 튜닝」.

댓글목록

등록된 댓글이 없습니다.

전체 56
게시물 검색
MySql 목록
번호 제목 글쓴이 조회 날짜
36 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4081 12-18
35 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3909 12-18
34 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3665 12-18
33 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3646 11-10
32 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3811 07-29
31 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3965 06-20
30 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4351 03-28
29 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4311 08-17
28 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4619 08-16
27 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4304 08-16
26 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 9820 05-07
25 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3996 08-10
24 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5055 08-03
23 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4079 08-03
22 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4715 07-30
21 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3961 07-27
20 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4013 03-10
19 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4391 03-05
열람중 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4060 03-05
17 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4042 03-04