
SELECT *
FROM customer
WHERE first_name = 'minsoo';
customer 테이블에 튜플이 100만개 있고, first_name = 'minsoo'에 index가 걸려있지 않다면
order by)하거나 그루핑(group by) 하기 위해불필요한 인덱스를 만들지 말자
id(primary key) | name | team_id | backnumber
CREATE INDEX player_name_idx ON player(name);
CREATE UNIQUE INDEX team_id_backnumber_idx ON player(team_id,backnumber);
CREATE TABLE(
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 player;

EXPLAIN
SELECT *
FROM player
WHERE backnumber = 7;

possible_keys : 사용할 수 있는 인덱스key : 사용한 인덱스Optimizer가 알아서 적절하게 index를 선택한다

SELECT *
FROM player
USE INDEX(backnumber_idx)
WHERE backnumber = 7;
Optimizer가 명시한 인덱스를 사용하지 않으면 full_scan으로 동작한다.
SELECT *
FROM player
FORCE INDEX(backnumber_idx)
WHERE backnumber = 7;
1. team_id_backnumber_idx 사용
SELECT *
FROM player
WHERE team_id = 110;
2. team_id_backnumber_idx 사용
SELECT *
FROM player
WHERE team_id = 110 AND backnumber = 7;
3. full scan
SELECT *
FROM player
WHERE backnumber= 7 ;
4. full scan
SELECT *
FROM player
WHERE team_id = 110 or backnumber = 7;
사용하는 쿼리에 맞춰서 적절하게 index를 걸어줘야 query가 빠르게 처리될 수 있다.
B-tree 기준으로 인덱스를 생성할 때 왼쪽을 기준으로 우선순위가 형성되고, 우선순위에 따라 정렬된다.
아래 예시에서 team_id 순으로 정렬되고, team_id가 동일할 경우 backnumber 순으로 정렬된다
CREATE UNIQUE INDEX team_id_backnumber_idx ON player(team_id,backnumber);
이미 데이터가 몇백만건 이상 있는 테이블에 인덱스를 생성하는 경우 시간이 몇 분이상 소요될 수 있고 DB 성능에 안좋은 영향을 줄 수 있다.
SELECT team_id, backnumber
FROM player
WHERE team_id = 5;
조회하는 attribute들을 모두 index가 cover할 때 조회성능이 더 빠름
조회하려는 데이터가 테이블의 상당 부분을 차지하거나, 테이블에 데이터가 조금 있는 경우 인덱스를 사용하는 것과 성능 차이가 작다.
Full scan 사용 여부는 Optimizer가 결정