• 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.1 MyISAM 쿼리 최적화

MyISAM 테이블 쿼리 속도를위한 몇 가지 일반적인 팁 :

  • MySQL이 쿼리를보다 효율적으로 최적화 할 수 있도록하려면 테이블에 데이터가로드 된 후에 그것에 대해 ANALYZE TABLE 을 사용하거나 myisamchk --analyze를 실행합니다. 이렇게하면 동일한 값이 평균 행 수를 나타내는 각 인덱스 파트의 값을 업데이트합니다. (고유 인덱스의 경우, 이것은 항상 1입니다.) MySQL은 이것을 사용하여 비 상수 식에 따라 두 개의 테이블을 조인 할 때 선택하는 인덱스를 결정합니다. SHOW INDEX FROM tbl_name 을 사용하고 Cardinality 값을 조사하여 테이블 분석 결과를 확인할 수 있습니다. myisamchk --description --verbose는 인덱스의 분포 정보를 보여줍니다.

  • 인덱스에 따라 인덱스와 데이터를 정렬하려면 myisamchk --sort-index --sort-records = 1을 사용합니다 (인덱스 1에 정렬한다고 가정하고). 인덱스에 따라 순차적으로 모든 행을 읽어하고자하는 고유 인덱스가있는 경우, 이것은 쿼리를 빠르게하는 적절한 방법입니다. 이 방법으로 큰 테이블을 처음으로 정렬 할 때 시간이 오래 걸릴 수 있습니다.

  • 자주 업데이트되는 MyISAM 테이블에 대한 복잡한 SELECT 쿼리를 피하고 리더와 라이터의 충돌로 인해 발생하는 테이블 잠금의 문제를 해결하도록하십시오.

  • MyISAM 은 동시 삽입을 지원하고 있습니다. 테이블의 데이터 파일 중간에 빈 블록이 없으면 다른 스레드가 테이블에서 읽을 것과 동시에 새로운 행을 거기에 INSERT 할 수 있습니다. 이를 수행 할 수있는 것이 중요한 경우 행 삭제를 피하기 위해 테이블​​을 사용하는 것을 고려하십시오. 또 다른 가능성은 테이블의 많은 행을 삭제 한 후에 OPTIMIZE TABLE 을 실행하여 테이블을 조각하는 것입니다. 이 동작은 concurrent_insert 변수의 설정에 따라 변경됩니다. 행을 삭제 한 테이블에 새로운 행을 강제로 추가 (따라서 동시 삽입을 허용) 할 수 있습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.

  • 자주 변경되는 MyISAM 테이블에서는 모든 가변 길이 컬럼 ​​( VARCHAR , TEXT 및 BLOB )를 피하도록합니다. 테이블에 하나만 가변 길이 컬럼이 포함되지 않은 경우에도 테이블은 동적 행 형식을 사용합니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.

  • 일반적으로 행이 커지기 때문에 만에 하나의 테이블을 다른 테이블로 분할하는 것은 도움이되지 않습니다. 행에 대한 액세스에서 가장 크고 성능에 타격을주는 것은 행의 첫 번째 바이트를 찾는 데 필요한 디스크 검색입니다. 데이터가 발견 된 후에는 대부분의 최신 디스크에서 대부분의 응용 프로그램에 충분한 속도로 행 전체를 읽을 수 있습니다. 테이블을 분할 할 상당한 차이를 가져올 상황은 고정 행 크기 변경 가능한 동적 행 형식을 사용하는 MyISAM 테이블의 경우 또는 테이블을 현저하게 자주 검사해야하지만, 대부분 열은 필요하지 않은 경우뿐입니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.

  • 일반적 expr1 、 expr2 、... 의 순서로 행을 검색하려면 ALTER TABLE ... ORDER BY expr1 , expr2 , ... 을 사용합니다. 테이블을 크게 변경 한 후이 옵션을 사용하여 성능을 향상시킬 수 있습니다.

  • 여러 줄의 정보를 바탕으로 계산 등 결과를 자주 계산할 필요가있는 경우, 새로운 테이블을 도입하여 실시간으로 카운터를 업데이트하는 것이 바람직 할 수 있습니다. 다음과 같은 형식의 업데이트는 매우 빠릅니다.

     UPDATE tbl_name SET count_col = count_col + 1 WHERE key_col = constant ;
    

    이것은 테이블 수준 잠금 (단일 라이터와 여러 리더) 밖에없는 MyISAM 과 같은 MySQL 스토리지 엔진을 사용하는 경우에 매우 중요합니다. 또한이 경우 행 잠금 관리자가 수행해야하는 것은 적기 때문에 대부분의 데이터베이스 시스템에서 성능이 향상됩니다.

  • 데이터가 기록되는시기를 알 필요가없는 경우에는 MyISAM (또는 기타 지원되는 비 트랜잭션 테이블)에 INSERT DELAYED 를 사용합니다. 많은 행을 1 개의 디스크 쓰기로 쓸 수 있기 때문에이를 통해 삽입의 전체 영향이 적습니다.

    참고

    MySQL 5.6.6 현재 INSERT DELAYED 는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신 INSERT ( DELAYED 를 붙이지 않는)을 사용하십시오.

  • 정기적으로 OPTIMIZE TABLE 을 사용하여 동적 포맷 MyISAM 테이블의 조각화를 방지합니다. 섹션 15.2.3 "MyISAM 테이블 스토리지 포맷" 을 참조하십시오.

  • DELAY_KEY_WRITE=1 테이블 옵션을 사용하여 MyISAM 테이블을 선언하면 테이블이 닫힐 때까지 디스크에 플러시되지 않기 때문에 인덱스의 업데이트가 빨라집니다. 단점은 이러한 테이블이 열려있는 동안 무언가에 의해 서버가 강제 종료 된 경우 --myisam-recover-options 옵션을 사용하여 서버를 실행하거나 서버를 다시 시작 전에 myisamchk를 실행하여 테이블이 문제가 없음을 확인해야하는 것입니다. (단,이 경우에도 키 정보는 항상 데이터 행에서 생성 할 수 있기 때문에 DELAY_KEY_WRITE 를 사용해도 아무것도 잃지 않는 것입니다.)

  • MyISAM 인덱스는 문자열의 앞뒤에 공백이 자동으로 압축됩니다. 섹션 13.1.13 "CREATE INDEX 구문" 을 참조하십시오.

  • 응용 프로그램에서 쿼리 및 응답을 캐시에서 많은 삽입이나 업데이트를 한꺼번에 실행하여 성능을 향상시킬 수 있습니다. 이 작업 중에 테이블을 잠금하여 모든 업데이트 후에 인덱스 캐쉬가 1 회만 플래시됩니다. 비슷한 결과를 얻으려면 MySQL 쿼리 캐시를 이용 할 수 있습니다. 섹션 8.9.3 "MySQL 쿼리 캐시" 를 참조하십시오.


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