자주 조회되는 데이터에 더 빠르게 접근하기 위한 관리 기법

실제 데이터와 별개로 일정한 기준에 따라 ‘명단’을 관리하는 개념

과도하게 사용하면 생성/수정 성능 저하

조회할 때는 별도로 인덱스를 쿼리에 명시하지 않아도 DB가 똑똑하게 효율적인 인덱스를 찾아서 사용

기본 문법

-- 생성
CREATE INDEX 인덱스명 ON 테이블명(컬럼명);

-- 삭제
DROP INDEX 인덱스명 ON 테이블명;

-- 조회
SHOW INDEX FROM 테이블명; // SHOW INDEX FROM *; 같은 건 아쉽게도 안 됨

-- 이름 변경 (MySQL 5.7+)
ALTER TABLE 테이블명 RENAME INDEX 기존명 TO 새이름;

사용 예시

-- 오름차순(기본값)
CREATE INDEX idx_created ON post(created_at ASC);

-- 내림차순  
CREATE INDEX idx_likes ON post(upvote_count DESC);

-- 복합 키 정렬 (ORDER BY와 같음 - 동점일 때 두 번쨰 정렬기준)
CREATE INDEX idx_votes ON post(upvote_count DESC, downvote_count ASC);

함수 기반 인덱스 (MySQL 8.0+)

-- 계산식 사용
CREATE INDEX idx_net_votes ON post((upvote_count - downvote_count));

-- 함수 실행 결과를 기준으로 인덱스에 저장
CREATE INDEX idx_upper_name ON user((UPPER(name)));

인덱스가 실제로 적용중인지 확인법

인덱스 조회

SHOW INDEX FROM 테이블명; // SHOW INDEX FROM *; 같은 건 아쉽게도 안 됨
mysql> show index from post;
+-------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+-------------------------------------+
| Table | Non_unique | Key_name                    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression                          |
+-------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+-------------------------------------+
| post  |          0 | PRIMARY                     |            1 | id          | A         |         188 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL                                |
| post  |          0 | UK6fke32y1k4finnmq2qklog695 |            1 | excuse_id   | A         |         188 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL                                |
| post  |          1 | FK83s99f4kx8oiqm3ro0sasmpww |            1 | member_id   | A         |         188 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL                                |
| post  |          1 | idx_net_votes               |            1 | NULL        | D         |          26 |     NULL |   NULL |      | BTREE      |         |               | YES     | (`upvote_count` - `downvote_count`) |
+-------+------------+-----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+-------------------------------------+
4 rows in set (0.01 sec)