• 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. 최적화 및 인덱스
    1. MySQL의 인덱스의 사용 방식
    2. Primary Key 사용
    3. Foreign Key 사용
    4. 컬럼 인덱스
    5. 멀티 컬럼 인덱스
    6. 인덱스 사용량 확인
    7. InnoDB와 MyISAM 인덱스 통계 수집
    8. B 트리 인덱스와 해시 인덱스의 비교
    4. 데이터베이스 구조의 최적화
    5. InnoDB 테이블의 최적화
    6. MyISAM 테이블의 최적화
    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.3.1 MySQL의 인덱스의 사용 방식

인덱스는 특정 컬럼 값이있는 행을 빠르게 찾는 데 사용됩니다. 인덱스가 없으면 MySQL은 관련 행을 찾을 수있는 첫 번째 행에서 시작하여 전체 테이블을 읽어야합니다. 테이블이 클수록이 비용이 커집니다. 테이블에 문제의 컬럼의 인덱스가 포함되어있는 경우, MySQL은 모든 데이터를 조사 할 필요없이 데이터 파일의 중간 탐색하는 위치를 빠르게 파악할 수 있습니다. 이것은 모든 행을 연속하여 읽는 것보다 훨씬 빠릅니다.

대부분의 MySQL 인덱스 ( PRIMARY KEY , UNIQUE , INDEX 및 FULLTEXT )는 B 트리 에 저장됩니다. 예외 : 공간 데이터 형식의 인덱스는 R 트리를 사용합니다. MEMORY 테이블은 해시 인덱스 도 지원합니다. InnoDB 는 FULLTEXT 인덱스 반전 목록을 사용합니다.

일반적으로 인덱스는 다음의 설명과 같이 사용됩니다. 해시 인덱스 ( MEMORY 테이블에서 사용되는 같은)의 고유 특성에 대한 자세한 내용은 섹션 8.3.8 "B 트리 인덱스와 해시 인덱스의 비교" 에서 설명하고 있습니다.

MySQL은 이러한 작업에 인덱스를 사용합니다.

  • WHERE 절에 일치하는 행을 빠르게 찾아 내기 위하여.

  • 행을 고려에 넣지 않도록하기 위하여. 여러 인덱스에서 선택하면, MySQL은 보통 최소 수의 행을 찾을 인덱스 (가장 선택적인 인덱스)를 사용합니다.

  • 테이블에 멀티 컬럼 인덱스가있는 경우, 옵티마이 저는 인덱스의 좌단의 프리픽스를 사용하여 행을 조회 할 수 있습니다. 예를 들어, (col1, col2, col3) 에 3 컬럼의 인덱스가있는 경우, (col1) , (col1, col2) 와 (col1, col2, col3) 에 인덱스 검색 기능을 사용할 수 있습니다. 자세한 내용은 섹션 8.3.5 "멀티 컬럼 인덱스" 를 참조하십시오.

  • 결합 실행시에 다른 테이블에서 행을 검색하기 위하여. 컬럼이 동일한 형태와 크기로 선언되어 있으면, MySQL은 컬럼의 인덱스를보다 효율적으로 사용할 수 있습니다. 이 컨텍스트에서는 VARCHAR 과 CHAR 은 같은 크기로 선언되어 있으면 동일한 것으로 간주됩니다. 예를 들어, VARCHAR(10) 과 CHAR(10) 는 같은 크기이지만, VARCHAR(10) 과 CHAR(15) 는 다릅니다.

    비 바이너리 문자열 컬럼 간 비교의 경우 두 컬럼에서 동일한 문자 집합을 사용하는한다. 예를 들어, utf8 컬럼과 latin1 컬럼의 비교는 인덱스의 사용 가능성을 부정합니다.

    이종의 컬럼의 비교 (문자열 컬럼을 시간 또는 숫자 컬럼과 비교하는 등)에서 값을 변환하지 않고 직접 비교할 수 없을 경우 인덱스의 사용을 방해 할 수 있습니다. 수치 열에서 1 등 특정 값의 경우 '1' , ' 1' , '00001' 또는 '01.e1' 등의 문자열 컬럼에있는 숫자 값과 같아 질 수 있습니다 . 이것은 문자열 컬럼의 인덱스의 사용을 제외합니다.

  • 특정 인덱스 설정된 컬럼 key_col 대해 MIN() 또는 MAX() 값을 찾아 내기 위하여. 이것은 인덱스에서 key_col 전에 발생하는 모든 키 부분에서 WHERE key_part_N = constant 가 사용되고 있는지 여부를 체크하는 프리 프로세서에 의해 최적화됩니다. 이 경우, MySQL은 각 MIN() 또는 MAX() 식에 대해 단일 키 조회를하고 그것을 상수로 대체합니다. 모든 수식이 상수로 대체하면 쿼리는 동시에 반환됩니다. 예 :

     SELECT MIN ( key_part2 ), MAX ( key_part2 )
       FROM tbl_name WHERE key_part1 = 10;
    
  • 사용 가능한 인덱스의 좌단의 프리픽스에 정렬 또는 그룹화가 발생하는 경우 (예를 들어, ORDER BY key_part1 , key_part2 ) 테이블을 정렬하거나 그룹화하는 데. 모든 키 부분의 뒤에 DESC 가 지정되어있는 경우, 키는 역순으로 읽습니다. 섹션 8.2.1.15 "ORDER BY 최적화" 및 섹션 8.2.1.16 "GROUP BY 최적화" 를 참조하십시오.

  • 경우에 따라 데이터 행을 참조하지 않고 값을 가져 오도록 쿼리를 최적화 할 수 있습니다. (쿼리 필요한 모든 결과를 제공하는 인덱스가 커버링 인덱스 라고합니다.) 쿼리가 테이블에서 특정 인덱스에 포함 된 컬럼만을 사용하는 경우 매우 빠른에 선택한 값을 인덱스 트리에서 얻을 수 있습니다.

     SELECT key_part3 FROM tbl_name
       WHERE key_part1 = 1
    

작은 테이블 또는 보고서 쿼리가 행의 대부분 또는 모든 것을 처리하는 큰 테이블에 대한 쿼리는 인덱스는 그다지 중요하지 않습니다. 쿼리에서 행의 대부분에 액세스 할 필요가있는 경우는 연속하여 읽는 것이 인덱스를 처리하는 것보다 빠릅니다. 쿼리에서 모든 행이 필요하지 않은 경우에도 순차적 읽기는 디스크 검색을 최소화합니다. 자세한 내용은 섹션 8.2.1.20 "풀 테이블 스캔을 방지하는 방법" 을 참조하십시오.

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