index가 없다면? full scan으로 검색해야 함 O(N)
index가 있다면 O(log N) - B tree 기반 인덱스
index 사용 이유? 조건을 만족하는 튜플을 빠르게 조회
MySQL에서 인덱스 생성
CREATE INDEX player_name_idx ON player (name);
CREATE UNIQUE INDEX team_id_backnumber_idx ON player (team_id, backnumber);
테이블을 생성하며 인덱스 생성
대부분 RDBMS에서 Primary key 생성 시 index 자동 생성
2개 이상 컬럼을 가지고 있는 인덱스를 multicolumn(composite) index
인덱스 조회 명령어 : SHOW INDEX FROM 테이블명;
인덱스를 찾을때 Binary Search 활용
(인덱스 조건 AND 인덱스x 조건)의 경우
즉, 사용되는 쿼리에 맞춰 적절하게 index를 걸어줘야 query가 빠르게 처리될 수 있다.
SQL 명령어 앞에 EXPLAIN 키워드를 적어주면 해당 쿼리가 어떤 index를 사용한 지 확인할 수 있음
optimizer가 알아서 적절한 index를 선택함
SELECT * FROM player USE INDEX (backnumber_idx) where backnumber = 7;
-> 권장 사항 느낌으로 알려줌
SELECT * FROM player FORCE INDEX (backnumber_idx) where backnumber = 7;
-> 결과 얻을 수 없으면 그냥 풀스캔(옵티마이저 판단, force 불가 시)
-> IGNORE INDEX(인덱스 사용x)
Index 생성 시 인덱스를 위한 부가적 데이터 생성됨
Covering Index : 조회하려는 attribute를 인덱스가 모두 커버 가능(실제 DB에 접근x)
team_id backnumber ptr ex) select team_id, backnumber FROM player where team_id=5 // index : team_id, backnumber
Hash index : Hash table 사용하여 index 구현
Full scan이 더 좋은 경우
id name mobile_carrier phone_number
- ex) 고객들 중 SK 통신사 사용자 조회
- ex) 대부분 SK 통신사 사용 시 full scan이 더 빠름
- SELECT * FROM customer WHERE mobile_carrier = 'SK';
order by나 group by 에도 index 사용될 수 있다.
foreign key에는 index가 자동으로 생성되지 않을 수 있다.
이미 데이터가 몇 백만 건 이상 있는 테이블에 인덱스를 생성하는 경우 시간이 몇 분 이상 소요될 수 있고 DB 성능에 안좋은 영향을 줄 수 있다.