• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 1. 최적화 개요
    2. SQL문 최적화
    3. 최적화 및 인덱스
    4. 데이터베이스 구조의 최적화
    5. InnoDB 테이블의 최적화
    6. MyISAM 테이블의 최적화
    1. MyISAM 쿼리 최적화
    2. MyISAM 테이블의 대량 데이터로드
    3. REPAIR TABLE 문 속도
    7. MEMORY 테이블 최적화
    8. 쿼리 실행 계획의 이해
    9. 버퍼링과 캐시
    10. 잠금 작업의 최적화
    11. MySQL 서버의 최적화
    12. 성능 측정
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 의 실행을 더욱 빠르게 할 수 있습니다. 다음 단계를 사용합니다.

    1. FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령을 실행합니다.

    2. 테이블 인덱스의 모든 사용을 삭제하려면 myisamchk --keys-used = 0 -rq /path/to/db/tbl_name 을 사용합니다.

    3. LOAD DATA INFILE 을 사용하여 테이블에 데이터를 삽입합니다. 이것은 인덱스를 업데이트하지 않기 때문에 매우 빠릅니다.

    4. 향후 테이블에서 읽기만하는 경우 myisampack를 사용하여 그것을 압축합니다. 섹션 15.2.3.3 "압축 테이블의 특징" 을 참조하십시오.

    5. myisamchk -rq /path/to/db/tbl_name 을 사용하여 인덱스를 다시 작성합니다. 따라서 디스크에 쓰기 전에 메모리에 인덱스 트리를 만들고 대량의 디스크 검색을 피하기 위해 LOAD DATA INFILE 시 인덱스의 업데이트보다 훨씬 빨라집니다. 결과의 인덱스 트리는 완전하게 밸런스도 잡혀 있습니다.

    6. FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령을 실행합니다.

    데이터를 삽입하는 MyISAM 테이블이 비어있는 경우는 LOAD DATA INFILE 은 앞서의 최적화를 자동으로 실행합니다. 자동 최적화 및 명시 적으로 절차를 사용할 수의 주요 차이점은 서버에 LOAD DATA INFILE 명령문을 실행할 때 인덱스를 다시 작성에 할당하도록 할 수있는 양보다 myisamchk는 인덱싱을 위해 더 많은 임시 메모리를 할당 할 수있는 것입니다.

    myisamchk 대신 다음 문을 사용하여 MyISAM 테이블의 고유하지 않은 인덱스를 활성화 또는 비활성화 할 수 있습니다. 이러한 문을 사용하면 FLUSH TABLE 작업을 생략 할 수 있습니다.

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


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved