어느 특정 테이블에 조건을 걸어 데이터를 조회하는 경우 모든 로우에 조건을 대입하는 full scan(=table scan)방식으로 찾아야 하고, 이러한 경우에 시간복잡도는 O(N)이다.
하미만 그 조건 컬럼에 인덱스가 걸려있고, 그 인덱스가 B-tree 기반의 인덱스라면 시간복잡도는 O(log N)이 된다.
| id | name | team_id | backnumber |
|---|---|---|---|
| - | - | - | - |
SELECT * FROM PLAYER WHERE name = 'Tom';
SELECT * FROM PLAYER WHERE team_id = 105 and backnumber = 7;
//인덱스 값이 중복 가능
CREATE INDEX player_name_idx ON PLAYER (name);
//인덱스 값이 중복 불가능
CREATE UNIQUE INDEX team_id_backnumber_idx ON PLAYER (team_id, backnumber);
CREATE TABLE PLAYER(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
team_id INT,
backnumber INT,
//인덱스 값이 중복 가능
INDEX player_name_idx (name),
UNIQUE INDEX team_id_backnumber_idx (team_id, backnumber)
);
SHOW INDEX FROM TABLE
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Null |
|---|---|---|---|---|---|
| player | 0 | PRIMARY | 1 | id | - |
| player | 0 | team_id_backnumber_idx | 1 | team_id | YES |
| player | 0 | team_id_backnumber_idx | 2 | backnumber | YES |
| player | 1 | player_name_idx | 1 | name | - |
A 테이블
| id | value |
|---|---|
| - | 1 |
| - | 3 |
| - | 2 |
| - | 2 |
| - | 4 |
| - | 0 |
INDEX(A) - B-tree 기반
| value | ptr |
|---|---|
| 0 | - |
| 1 | - |
| 2 | - |
| 2 | - |
| 3 | - |
| 4 | - |
/// 인덱스가 되는 에트리뷰트는 왼쪽부터 우선 순위가 된다.
CREATE INDEX player_name_idx ON PLAYER (first, second);
EXPLAIN
SELECT * FROM PLAYER WHERE backnumber = 7;
쿼리 결과
| table | possible_keys | key |
|---|---|---|
| player | backnumber_idx | backnumber_idx |
// 사용 권장
SELECT * FROM PLAYER USE INDEX(backnumber_idx) WHERE backnumber = 7;
// 사용해
SELECT * FROM PLAYER FORCE INDEX(backnumber_idx) WHERE backnumber = 7;
// 사용하지마
SELECT * FROM PLAYER IGNORE INDEX(backnumber_idx) WHERE backnumber = 7;
참고 문서 및 링크