8.3.5 멀티 컬럼 인덱스
MySQL은 복합 인덱스 (즉, 여러 컬럼에 대한 인덱스)를 만들 수 있습니다. 인덱스는 최대 16 컬럼으로 구성 할 수 있습니다. 특정 데이터 유형은 컬럼의 프리픽스 인덱스를 설정할 수 있습니다 ( 섹션 8.3.4 "컬럼 인덱스" 를 참조하십시오).
MySQL은 인덱스에서 모든 컬럼을 테스트하는 쿼리 또는 첫 번째 컬럼 처음 두 개의 컬럼 처음 세 개의 컬럼과 같이 테스트하는 쿼리에 멀티 컬럼 인덱스를 사용할 수 있습니다. 인덱스 정의의 올바른 순서로 컬럼을 지정하는 경우 단일 복합 인덱스는 같은 테이블에 여러 종류의 쿼리 속도를 높일 수 있습니다.
멀티 컬럼 인덱스는 인덱스 설정된 컬럼의 값을 연결하여 만든 값을 포함하는 행이다 정렬 된 배열로 간주 될 수 있습니다.
복합 인덱스 대신 다른 컬럼의 정보에 따라 '해시 된'컬럼을 도입 할 수 있습니다. 이 컬럼이 짧아 충분히 고유 인덱스가 설정되어있는 경우, 다수의 컬럼에 "광범위한"인덱스보다 빠를 수 있습니다. MySQL에서는이 추가 컬럼을 매우 쉽게 사용할 수 있습니다.
SELECT * FROM tbl_name
WHERE hash_col
= MD5 (CONCAT ( val1
, val2
)) AND col1
= val1
AND col2
= val2
;
테이블이 다음과 같은 사양이라고합니다.
CREATE TABLE test ( id INT NOT NULL, last_name CHAR (30) NOT NULL, first_name CHAR (30) NOT NULL, PRIMARY KEY (id) INDEX name (last_name, first_name) );
name
인덱스는 last_name
컬럼과 first_name
컬럼에 대한 인덱스입니다. 이 인덱스는 last_name
값과 first_name
값의 조합에 알려진 범위의 값을 지정하는 쿼리 조회에 사용할 수 있습니다. 그 컬럼은 인덱스의 좌단의 프리픽스이기 때문에 last_name
값만을 지정하는 쿼리에 사용할 수 있습니다 (이 부분에서 후술하는 바와 같이). 따라서 name
인덱스는 다음 쿼리에서 조회에 사용됩니다.
SELECT * FROM test WHERE last_name = 'Widenius'; SELECT * FROM test WHERE last_name = 'Widenius'AND first_name = 'Michael'; SELECT * FROM test WHERE last_name = 'Widenius' AND (first_name = 'Michael'OR first_name = 'Monty'); SELECT * FROM test WHERE last_name = 'Widenius' AND first_name> = 'M'AND first_name < 'N';
그러나 name
인덱스는 다음 쿼리 조회에 사용되지 않습니다.
SELECT * FROM test WHERE first_name = 'Michael'; SELECT * FROM test WHERE last_name = 'Widenius'OR first_name = 'Michael';
다음 SELECT
문을 발행한다고합니다.
SELECT * FROMtbl_name
WHERE col1 =val1
AND col2 =val2
;
col1
과 col2
에 대한 멀티 컬럼 인덱스가 존재하는 경우 해당 행을 직접 가져올 수 있습니다. col1
과 col2
에 대해 별도의 단일 컬럼 인덱스가 존재하는 경우, 옵티마이 저는 인덱스 병합 최적화 ( 섹션 8.2.1.4 "인덱스 병합 최적화" 를 참조하십시오)의 사용을 시도하거나 보다 많은 행을 제외 인덱스를 판단하여 그 인덱스를 사용하여 행을 인출함으로써 가장 제한적인 인덱스를 찾으려고합니다.
테이블에 멀티 컬럼 인덱스가있는 경우, 옵티마이 저는 인덱스의 좌단의 프리픽스를 사용하여 행을 조회 할 수 있습니다. 예를 들어, (col1, col2, col3)
에 3 컬럼의 인덱스가있는 경우, (col1)
, (col1, col2)
와 (col1, col2, col3)
에 인덱스 검색 기능을 사용할 수 있습니다.
컬럼이 인덱스의 좌단의 프리픽스를 형성하지 않은 경우 MySQL이 인덱스를 사용하여 조회를 실행할 수 없습니다. 여기에 표시된 SELECT
문이 있다고합니다.
SELECT * FROMtbl_name
WHERE col1 =val1
; SELECT * FROMtbl_name
WHERE col1 =val1
AND col2 =val2
; SELECT * FROMtbl_name
WHERE col2 =val2
; SELECT * FROMtbl_name
WHERE col2 =val2
AND col3 =val3
;
(col1, col2, col3)
인덱스가 존재하는 경우, 처음 두 개의 쿼리 만이 인덱스를 사용합니다. 세 번째와 네 번째 쿼리에는 인덱스 설정된 컬럼이 관계 있지만 (col2)
와 (col2, col3)
는 (col1, col2, col3)
의 좌단의 프리픽스가 없습니다.