일반적인 인덱스는 칼럼 값 일부(칼럼의 값 앞부분) 또는 전체에 대해서만 인덱스 생성이 허용된다.
칼럼의 값을 변형해서 만들어진 값에 대해 인덱스를 구축하는 경우도 있는데, 함수 기반의 인덱스를 활용하면 된다.
함수 기반 인덱스를 구현하는 방법은 두 가지 이다.
MySQL 서버의 함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 존재
실제 인덱스의 내부적인 구조 및 유지관리 방법은 B-Tree 인덱스와 동일하다.
컬럼을 합쳐서 검색해야 하는 경우, 두 칼럼의 값을 합친 가상 칼럼을 추가하고 그 가상 칼럼에 인덱스를 생성할 수 있다.
가상 칼럼은 테이블에 새로운 칼럼을 추가하는 것과 같은 효과를 내기 때문에 실제 테이블의 구조가 변경된다는 단점이 있다.
가상 칼럼과 함수를 직접 이용하는 인덱스는 내부적으로 동일한 구현 방법을 사용한다.
내부적인 구현이 동일한 것이라 볼 수 있으며, 어떤 방법을 사용하더라도 둘의 성능차이는 발생하지 않는다는 것을 의미한다.
전문 검색 인덱스를 제외한 모든 인덱스는 레코드 1건이 1개의 인덱스 키 값을 가진다.
멀티 밸류 인덱스는 하나의 데이터 레코드가 여러 개의 키 값을 가질 수 있는 형태의 인덱스다.
멀티 밸류 인덱스를 활용하기 위해서는 일반적인 조건 방식이 아닌, 반드시 다음 함수들을 이용해서 검색해야 옵티마이저가 인덱스를 활용한 실행 계획을 수립한다.
MEMBER OF()
JSON_CONTAINS()
JSON_OVERLAPS()
-- 특정 값이 멀티 밸류 필드에 포함되어 있는 레코드를 조회하는 예시
SELECT *
FROM my_table
WHERE 'value1' MEMBER OF (multi_value_field);
-- 멀티 밸류 필드에 특정 값이 포함되어 있는 레코드를 조회하는 예시
SELECT *
FROM my_table
WHERE JSON_CONTAINS(multi_value_field, 'value1');
-- 두 멀티 밸류 필드가 중복되는 값을 가지고 있는 레코드를 조회하는 예시
SELECT *
FROM my_table
WHERE JSON_OVERLAPS(multi_value_field1, multi_value_field2);