CS지식

DB Index

두잇 두두 2024. 10. 8. 13:16
728x90

Index를 쓰는 이유: 조건을 만족하는 튜플(들)을 빠르게 조회하기 위해, 정렬, 그룹핑 하기 위해

 

Index 만들기

CREATE INDEX player_name_idx ON player(name);
CREATE UNIQUE INDEX team_id_backnumber_idx ON player(team_id, backnumber);
// multicolumn index, composite index
SHOW INDEX FROM player;

 

B-tree 기반 Index 동작 방식

index로 지정한 것 기준으로 Tree 구조로 만들어짐

EXPLAIN SELECT*FROM player WHERE backnumber = 7;
// 어떤 키를 사용하는 지 알 수 있음

 

직접 INDEX 고르기

SELECT * FROM player USE INDEX(backnumber_idx) where backnumber = 7;
SELECT * FROM player FORCE INDEX(backnumber_idx) where backnumber = 7; // 더 강하게
IGNORE INDEX도 사용 가능

 

INDEX는 막 만들어도 괜찮을까?

index 생성 시 추가 데이터 공간 발생, 오버헤드 만들어 질 가능성이 있음, table에 write 할 때마다 index도 변경 발생

 

Covering index

SELECT team_id, backnumber FROM player WHERE team_id = 5;

index 만으로 조회하는 attribute를 index 모두 cover 할 때 조회 성능이 더 빨라짐

 

Hash index

hash table을 사용해서 index 구현

시간 복잡도 O(1) 성능

rehashing에 대한 부담(데이터 사이즈를 늘려주는 것)

equality 비교만 가능, range 비교 불가능

multicolumn index의 경우 전체 attributes에 대한 조회만 가능

 

Full Scan이 더 좋은 경우

table에 데이터가 조금 있을 때

조회하려는 데이터가 테이블의 상당 부분을 차지할 때(SELECT*FROM customer WHERE mobile_carrier = 'SK')