Search
Duplicate
6️⃣

함수 기반 인덱스

일반적인 인덱스는 칼럼의 값 일부 또는 전체에 대해서만 인덱스 생성이 허용, 때때로 칼럼의 값을 변형했을 때 인덱스를 구축해야 할 때도 있는데, 이땐 함수 기반 인덱스를 사용
함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 있을 뿐, 실제 인덱스의 내부 구조 및 유지관리 방법은 B-Tree 인덱스와 동일

1. 가상 칼럼을 이용한 인덱스

CREATE TABLE user { user_id BIGINT, first_name VARCHAR(10), last_name VARCHAR(10), PRIMARY KEY (user_id) );
SQL
복사
위와 같은 테이블의 frist_namelast_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
복사
함수를 직접 사용하여 정의하는 인덱스는 테이블의 구조를 변경하지 않고 계산된 결괏값의 검색을 빠르게 만들어준다.
함수 기반 인덱스를 제대로 활용하려면 반드시 조건절에 함수 기반 인덱스에 명시된 표현식이 그대로 사용되어야 한다.