자주 조회되는 데이터에 더 빠르게 접근하기 위한 관리 기법
실제 데이터와 별개로 일정한 기준에 따라 ‘명단’을 관리하는 개념
과도하게 사용하면 생성/수정 성능 저하
조회할 때는 별도로 인덱스를 쿼리에 명시하지 않아도 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)