MySQL에서 여러 열을 하나의 인덱스로 묶고 싶다면 KEY()를 사용하면 됩니다. 이렇게 여러 열을 함께 지정한 인덱스를 복합 인덱스(Composite Index)라고 부르며, 두 개 이상의 열을 조건으로 자주 조회하는 경우 쿼리 성능을 크게 향상시킬 수 있습니다.
1. 세 개의 열로 인덱스가 포함된 테이블 생성하기
먼저 StudentId, StudentMarks, StudentAge 세 열에 대해 KEY()로 인덱스를 설정한 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1437
-> (
-> StudentId int,
-> StudentName varchar(20),
-> StudentMarks int,
-> StudentAge int,
-> KEY(StudentId,StudentMarks,StudentAge)
-> );
Query OK, 0 rows affected (0.97 sec)
2. 테이블 구조 확인하기
DESC 명령어를 사용하면 테이블의 구조와 인덱스 적용 여부를 확인할 수 있습니다.
mysql> desc DemoTable1437;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| StudentId | int(11) | YES | MUL | NULL | |
| StudentName | varchar(20) | YES | | NULL | |
| StudentMarks | int(11) | YES | | NULL | |
| StudentAge | int(11) | YES | MUL | NULL | |
+--------------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
결과에서 Key 컬럼 값이 MUL로 표시되는 것을 확인할 수 있습니다. MUL은 해당 열이 복합 인덱스의 일부임을 의미합니다. 첫 번째 열(StudentId)은 인덱스의 시작 열이므로 항상 MUL로 표시됩니다.
3. 데이터 삽입하기
INSERT 문을 사용해 테이블에 레코드를 추가해 보겠습니다.
mysql> insert into DemoTable1437 values(101,'Chris',78,21);
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable1437 values(102,'David',89,22);
Query OK, 1 row affected (0.25 sec)
4. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1437;
실행 결과는 다음과 같습니다.
+-----------+-------------+--------------+------------+
| StudentId | StudentName | StudentMarks | StudentAge |
+-----------+-------------+--------------+------------+
| 101 | Chris | 78 | 21 |
| 102 | David | 89 | 22 |
+-----------+-------------+--------------+------------+
2 rows in set (0.00 sec)
복합 인덱스 활용 시 주의사항
복합 인덱스는 최 좌측 접두사(Leftmost Prefix) 원칙을 따릅니다. 즉, 위 예제의 인덱스는 StudentId 단독 조회, StudentId + StudentMarks 조합 조회, 그리고 세 열 모두를 사용하는 조회에는 활용되지만, StudentMarks나 StudentAge만 단독으로 조회하는 경우에는 인덱스가 제대로 작동하지 않습니다. 따라서 WHERE 절에서 가장 자주 사용되는 열을 인덱스의 첫 번째 순서로 배치하는 것이 성능 최적화의 핵심입니다.