•
일반적인 인덱스는 칼럼의 값 일부 또는 전체에 대해서만 인덱스 생성이 허용, 때때로 칼럼의 값을 변형했을 때 인덱스를 구축해야 할 때도 있는데, 이땐 함수 기반 인덱스를 사용
•
함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 있을 뿐, 실제 인덱스의 내부 구조 및 유지관리 방법은 B-Tree 인덱스와 동일
1. 가상 칼럼을 이용한 인덱스
CREATE TABLE user {
user_id BIGINT,
first_name VARCHAR(10),
last_name VARCHAR(10),
PRIMARY KEY (user_id)
);
SQL
복사
•
위와 같은 테이블의 frist_name과 last_name을 합쳐서 검색해야할 요건이 생겼다고 가정하자.
◦
이전 버전의 경우 full_name이라는 칼럼을 추가하고 모든 레코드에 대해 업데이트해주는 작업을 거쳐야만 full_name이라는 인덱스를 추가할 수 있었다.
◦
하지만 8.0부터는 가상 컬럼을 추가하고 그 가상 컬럼에 인덱스를 추가할 수 있게됨
ALTER TABLE user
ADD full_name VARCHAR(30) AS (CONCAT(first_name, ' ', last_name)) VIRTUAL,
ADD INDEX ix_fullname (full_name);
SQL
복사
•
이렇게 정의해주면 full_name 칼럼에 대한 검색도 새로 만들어진 인덱스를 통해 진행되는 것을 확인할 수 있다. 또한 STORED, VIRTUAL 어떤 옵션으로 진행해도 상관없으며 차이는 추후 15.8절에 설명
2. 함수를 이용한 인덱스
•
8.0부터 추가된 기능으로 테이블의 구조를 변경하지 않고도 함수를 직접 사용하는 인덱스를 생성할 수 있게 됐음
CREATE TABLE user (
user_id BIGINT,
first_name VARCHAR(10),
last_name VARCHAR(10),
PRIMARY KEY (user_id),
INDEX ix_fullname ((CONCAT(first_name,' ',last_name)))
);
SQL
복사
•
함수를 직접 사용하여 정의하는 인덱스는 테이블의 구조를 변경하지 않고 계산된 결괏값의 검색을 빠르게 만들어준다.
•
함수 기반 인덱스를 제대로 활용하려면 반드시 조건절에 함수 기반 인덱스에 명시된 표현식이 그대로 사용되어야 한다.