8.3.8 B 트리 인덱스와 해시 인덱스의 비교
B 트리 및 해시 데이터 구조를 이해하는 것은 인덱스에 이러한 데이터 구조를 사용하는 다양한 스토리지 엔진 (특히 B 트리 인덱스를 사용하거나 해시 인덱스를 사용할지 여부를 선택할 수 MEMORY
스토리지 엔진의 경우 에) 다양한 쿼리가 어떻게 실행되는지를 예측하는 데 도움이 될 수 있습니다.
B 트리 인덱스의 특성
B 트리 인덱스는 =
, >
, > >=
, <
, <=
, 또는 BETWEEN
연산자를 사용하는 수식에서 컬럼 비교로 사용할 수 있습니다. 이 인덱스는 LIKE
의 인수가 와일드 카드 문자로 시작하지 않는 상수 문자열의 경우 LIKE
비교에도 사용할 수 있습니다. 예를 들어 다음의 SELECT
문은 인덱스를 사용합니다.
SELECT * FROMtbl_name
WHEREkey_col
LIKE 'Patrick %'; SELECT * FROMtbl_name
WHEREkey_col
LIKE 'Pat % _ck %';
첫 번째 문장에서는 'Patrick' <=
라인 만 고려됩니다. 두 번째 문은 key_col
< 'Patricl''Pat' <=
라인 만이 고려됩니다. key_col
< 'Pau'
다음의 SELECT
문은 인덱스를 사용하지 않습니다.
SELECT * FROMtbl_name
WHEREkey_col
LIKE '% Patrick %'; SELECT * FROMtbl_name
WHEREkey_col
LIKEother_col
;
첫 번째 문장에서는 LIKE
값은 와일드 카드 문자로 시작합니다. 두 번째 문은 LIKE
값은 상수가 아닙니다.
... LIKE '%
를 사용하여 string
%'string
이 3 자보다 긴 경우 MySQL은 Turbo Boyer-Moore 알고리즘을 사용하여 문자열의 패턴을 초기화하고 나서,이 패턴을 사용하여 검색 를보다 신속하게 실행합니다.
을 사용하는 검색은 col_name
IS NULLcol_name
에 인덱스가 설정되어있는 경우에 인덱스가 사용됩니다.
WHERE
절 내의 모든 AND
레벨에 위치해있는 인덱스는 쿼리 최적화에 사용되지 않습니다. 즉, 인덱스의 사용을 가능하게하려면 인덱스 프리픽스가 모든 AND
그룹에서 사용되고있을 필요가 있습니다.
다음 WHERE
절에서는 인덱스가 사용됩니다.
... WHEREindex_part1
= 1 ANDindex_part2
= 2 ANDother_column
= 3 / *index
= 1 ORindex
= 2 * / ... WHEREindex
= 1 OR A = 10 ANDindex
= 2 / * optimized like "index_part1
= 'hello' "* / ... WHEREindex_part1
= 'hello'ANDindex_part3
= 5 / * Can use index onindex1
but not onindex2
orindex3
* / ... WHEREindex1
= 1 ANDindex2
= 2 ORindex1
= 3 ANDindex3
= 3;
이 WHERE
절에서는 인덱스가 사용되지 않습니다.
/ *index_part1
is not USED * / ... WHEREindex_part2
= 1 ANDindex_part3
= 2 / * Index is not used in both parts of the WHERE clause * / ... WHEREindex
= 1 OR A = 10 / * No index spans all rows * / ... WHEREindex_part1
= 1 ORindex_part2
= 10
MySQL은 인덱스를 사용할 수있는 경우에도 사용하지 않을 수 있습니다. 이런 경우 하나의 상황은 최적화 프로그램이 인덱스를 사용하여 MySQL이 테이블의 대부분의 행에 액세스 할 필요가 있다고 추정 한 경우입니다. (이 경우 필요한 시크가 적기 때문에 테이블 스캔 쪽이 훨씬 빠를 수 있습니다.) 그러나 그런 쿼리에서 행의 일부만을 얻을 LIMIT
를 사용하는 경우 결과로 반환 약간 줄을 훨씬 빠르게 찾을 수 있기 때문에, MySQL은 어쨌든 인덱스를 사용합니다.
해시 인덱스의 특성
해시 인덱스는 앞서 언급 한 것과 약간 다른 특성을가집니다.
그들은,
=
또는<=>
연산자를 사용하는 등가 비교에만 사용됩니다 (단 매우 빠릅니다). 그들은 값의 범위를 찾을<
등의 비교 연산자는 사용되지 않습니다. 이 종류의 단일 값 조회에 의존하는 시스템은 "키 값 스토어 '로 알려져 있습니다. 이러한 응용 프로그램에서 MySQL을 사용하려면 가능한 한 많은 해시 인덱스를 사용합니다.옵티마이 저는 해시 인덱스를 사용하여
ORDER BY
조작을 빠르게 할 수 없습니다. (이 종류의 인덱스는 순서에 다음 항목을 검색하는 데 사용할 수 없습니다.)MySQL은 두 값 사이에 대략 얼마나 줄 수가 있는지를 확인할 수 없습니다 (이것은 범위 최적화 프로그램에서 사용하는 인덱스를 식별하는 데 사용됩니다). 이것은
MyISAM
또는InnoDB
테이블을 해시 인덱스 설정된MEMORY
테이블에 변경 한 경우 일부 쿼리에 영향을 줄 수 있습니다.행의 검색에 키 전체만을 사용할 수 있습니다. (B 트리 인덱스는 키의 모든 왼쪽의 접두어를 사용하여 행을 검색 할 수 있습니다.)