SELECT *
FROM customer
WHERE first_name = 'Minsoo';
위 쿼리를 실행할 때 first_name
에
B-tree (Balanced-tree)기반의 index가 동작하는 방식
노드(node) = 페이지
무조건 루프 페이지부터 검색한 리프 페이지로 이동
만약 위와 같이 2번째 리프 페이지가 모두 차있는 상태에서 ‘GGG’라는 값을 넣게 된다면FFF 다음에 GGG가 삽입되어야 하므로 새로운 페이지가 필요함 → 페이지 분할
페이지 분할을 수행한 후에 새로운 페이지를 루트에 등록해야 함
❗ 데이터가 많아질 수록 데이터를 추가할 때, 수정할 때(순서가 바뀜), 삭제할 때 수행해야 할 처리가 많아짐
아래와 같은 상황일 때 index를 어떻게 만들 수 있는가
name
에 index 걸어주기 → name
은 중복이 허용됨
CREATE INDEX player_name_idx ON player (name);
team_id와 back_number에 함께 index를 걸어주어야 함
-> team_id
와 backnumber
를 이용하면 선수들을 unique하게 식별할 수 있음
CREATE UNIQUE INDEX team_id_backnumber_idx
ON player (team_id, backnumber);
- 여러 attributes에 대한 index가 있다면 생성할 때 왼쪽에 있던 index 순으로 먼저 정렬됨
- 위와 같은 경우라면 team_id를 기준으로 먼저 정렬되고 그 다음으로 backnumber 기준으로 정렬된 index를 생성함
아래 테이블을 생성할 때 index를 생성하려면
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)
);
multicolumn index
, composite index
특정 테이블에 어떤 index가 걸려있는지 확인할 때
SHOW INDEX FROM player
쿼리문이 어떤 index를 사용하는지 확인하기 위해서 아래 코드를 실행하면 됨
EXPLAIN
SELECT * FROM player WHERE backnumber = 7;
optimizer가 이상한 index를 사용해서 성능이 안나와서 직접 사용할 index를 정하고 싶다면
// 가급적 지명한 index 사용해줘
SELECT * FROM player USE INDEX (backnumber_idx)
WHERE backnumber = 7;
// 꼭 지명한 index 사용해줘
SELECT * FROM player FORCE INDEX (backnumber_idx)
WHERE backnumber = 7;
// 지명한 index 사용하지 말아줘
SELECT * FROM player IGNORE INDEX (backnumber_idx)
WHERE backnumber = 7;