MySQL에서 함수 기반 인덱스를 사용할 수 있나요?
MySQL 5.6 미만 버전에서는 함수 기반 인덱스를 생성할 수 없었습니다. 이 글에서는 MySQL에서 함수 기반 인덱스를 만드는 방법을 단계별로 살펴보겠습니다.
1단계: 테스트용 테이블 생성
먼저 함수 기반 인덱스를 적용할 테이블을 생성합니다.
mysql> create table FunctionIndexDemo -> ( -> FirstName varchar(100) -> ); Query OK, 0 rows affected (0.70 sec)
2단계: 함수 기반 인덱스 생성 문법
함수 기반 인덱스를 생성하는 기본 문법은 다음과 같습니다.
create index index_name on yourTableName (column_name(IntegerSize));
여기서 IntegerSize는 인덱스를 적용할 문자열의 접두사 길이를 의미합니다. 즉, 전체 컬럼 값이 아닌 지정한 길이만큼의 앞부분에 대해서만 인덱스가 생성됩니다.
3단계: 실제 인덱스 생성 쿼리 실행
다음은 FirstName 컬럼의 앞 6자에 대해 인덱스를 생성하는 쿼리입니다.
mysql> create index indFirstName on FunctionIndexDemo (FirstName(6)); Query OK, 0 rows affected (0.56 sec) Records: 0 Duplicates: 0 Warnings: 0
4단계: 인덱스 생성 여부 확인
인덱스가 정상적으로 생성되었는지 확인하려면 SHOW INDEX 명령어를 사용합니다.
mysql> SHOW INDEX FROM FunctionIndexDemo;
실행 결과는 다음과 같습니다.
+-------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +-------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ | functionindexdemo | 1 | indFirstName | 1 | FirstName | A | 0 | 6 | NULL | YES | BTREE | | | YES | +-------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+ 1 row in set (0.24 sec)
결과 분석
출력 결과에서 확인할 수 있는 주요 정보는 다음과 같습니다.
Sub_part = 6: FirstName 컬럼의 앞 6자에 대해서만 인덱스가 적용되었음을 의미합니다.
Index_type = BTREE: B-트리 구조로 인덱스가 생성되었음을 나타냅니다.
Non_unique = 1: 중복 값을 허용하는 일반(비고유) 인덱스임을 보여줍니다.
이처럼 MySQL에서는 컬럼 값의 일부(접두사)에 인덱스를 적용하여 저장 공간을 절약하고 검색 성능을 최적화할 수 있습니다. 참고로, 표현식 자체에 대한 진정한 의미의 함수 기반 인덱스(Functional Index)는 MySQL 8.0.13부터 공식적으로 지원됩니다.