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
가 사용되고 있는지 여부를 체크하는 프리 프로세서에 의해 최적화됩니다. 이 경우, MySQL은 각key_part_N
=constant
MIN()
또는MAX()
식에 대해 단일 키 조회를하고 그것을 상수로 대체합니다. 모든 수식이 상수로 대체하면 쿼리는 동시에 반환됩니다. 예 :SELECT MIN (
key_part2
), MAX (key_part2
) FROMtbl_name
WHEREkey_part1
= 10;사용 가능한 인덱스의 좌단의 프리픽스에 정렬 또는 그룹화가 발생하는 경우 (예를 들어,
ORDER BY
) 테이블을 정렬하거나 그룹화하는 데. 모든 키 부분의 뒤에key_part1
,key_part2
DESC
가 지정되어있는 경우, 키는 역순으로 읽습니다. 섹션 8.2.1.15 "ORDER BY 최적화" 및 섹션 8.2.1.16 "GROUP BY 최적화" 를 참조하십시오.경우에 따라 데이터 행을 참조하지 않고 값을 가져 오도록 쿼리를 최적화 할 수 있습니다. (쿼리 필요한 모든 결과를 제공하는 인덱스가 커버링 인덱스 라고합니다.) 쿼리가 테이블에서 특정 인덱스에 포함 된 컬럼만을 사용하는 경우 매우 빠른에 선택한 값을 인덱스 트리에서 얻을 수 있습니다.
SELECT
key_part3
FROMtbl_name
WHEREkey_part1
= 1
작은 테이블 또는 보고서 쿼리가 행의 대부분 또는 모든 것을 처리하는 큰 테이블에 대한 쿼리는 인덱스는 그다지 중요하지 않습니다. 쿼리에서 행의 대부분에 액세스 할 필요가있는 경우는 연속하여 읽는 것이 인덱스를 처리하는 것보다 빠릅니다. 쿼리에서 모든 행이 필요하지 않은 경우에도 순차적 읽기는 디스크 검색을 최소화합니다. 자세한 내용은 섹션 8.2.1.20 "풀 테이블 스캔을 방지하는 방법" 을 참조하십시오.