데이터베이스 테이블의 검색 속도를 높여주는 자료구조이다. 인덱스는 특정 컬럼에 대한 정렬된 데이터 세트를 제공하여 검색 및 정렬 작업을 빠르게 수행할 수 있도록 한다.
인덱스는 MYI(MySQL Index)파일에 저장되며, 인덱스가 설정되지 않았다면 Table Full Scan이 일어나 성능이 저하되거나 치명적인 장애가 발생한다.
인덱스는 주로 WHERE 절에 사용되는 조건 검색, ORDER BY절의 정렬, GROUP BY절의 그룹화 작업에 효과적이다. 하지만, 인덱스를 사용하면 읽기 성능은 향상되지만 쓰기 성능은 약간 저하될 수 있다(Table의 index 색인 정보를 갱신하는 추가적인 비용 소요). 따라서 적절한 인덱스를 선택하고 설계하는 것이 중요하다.
CREATE INDEX idx_single_column
ON your_table(column1);
CREATE INDEX idx_multi_column
ON your_table(column1, column2);
인덱스는 ORDER BY와 GROUP BY에도 영향을 끼치는데 다음과 같은 경우에는 인덱스를 타지 않는다.
ORDER BY 인덱스 컬럼1, 컬럼2
WHERE 컬럼1 = '값' ORDER BY 인덱스 컬럼
ORDER BY 인덱스컬럼1 DESC, 인덱스컬럼2 ASC
GROUP BY 컬럼1 ORDER BY 컬럼2
ORDER BY ABS(컬럼)
-- 단일 인덱스
CREATE [UNIQUE] INDEX index_name
ON table_name(column1)
-- 다중 컬럼 인덱스
CREATE [UNIQUE] INDEX index_name
ON table_name(column1, column2, ...)
SHOW INDEX FROM table_name;
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| your_table | 0 | PRIMARY | 1 | id | A | 100000 | NULL | NULL | | BTREE | | |
| your_table | 1 | idx_name | 1 | column1 | A | 10000 | NULL | NULL | | BTREE | | |
| your_table | 1 | idx_name | 2 | column2 | A | 100000 | NULL | NULL | | BTREE | | |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
ALTER TABLE
문을 사용한다.-- 인덱스 추가
ALTER TABLE table_name
ADD INDEX index_name (column1, column2, ...);
-- 고유한 인덱스 추가
ALTER TABLE table_name
ADD UNIQUE INDEX index_name (column1, column2, ...);
-- 인덱스 삭제
ALTER TABLE table_name
DROP INDEX index_name;
DROP INDEX index_name
ON table_name;
CREATE INDEX index_name ON table_name (column1 DESC)
CREATE INDEX index_name ON table_name (column2 ASC)