[ YOUTUBE 쉬운코드 - DB ]
DB 쿼리 속도를 높이는데 매우 중요한 것이 INDEX. 그래서 실무에서도 매우 자주 사용 된다.
조건을 만족하는 튜플(들)을 빠르게 조회하기 위해
아래 쿼리문을 예시를 들어보자 (이후 설명할 내용들은 MySQL 기준 )
where절 이하,Join할때 조건들을 만족하는 데이터들을 빠르게 찾기위해 필요한 것이 Index !!!
INDEX를 걸어주는 문법
primary key의 경우는 index가 자동으로 생성된다.
- <INDEX 인덱스이름 (속성) > 로 index를 만들어줄 수 있음
- UNIQUE한 값을 가져야 하는 index일 경우 UNIQUE를 앞에 붙여주면 됨
INDEX(a)를 만들어 보자
- a의 대한 값들이 작은값부터 큰값으로 순서대로 저장이 됨
- pointer는 실제 MEMBERS 테이블이 가지고 있는 튜플을 가르킴 (연결 고리)
whera a = 9 인 튜플을 찾아보자
INDEX(a)의 가운데를 찾아 크기를 비교후 작은경우 아래 쪽 a를 스캔하는것을 제외시키는 과정을 반복함
최종적으로 MEMBERS 튜플에 있는 값을 조회할수 있게됨
where a= 7 and b= 95 는 어떨까
- 마찬가지로 INDEX(a)의 가운데에서 크기를 비교하면서 7을찾을때 까지 제외시켜나감
- 부분적으로는 만족하나 b값을 확인하기 위해 실제 튜플까지 찾아가서 b값과 비교해야함
- 나머지도 비교해봤더니 위쪽 값도 7로 같음
-> 마찬가지로 튜플까지 b값과 비교해야함
a에 관해서만 index가 있기 때문에 a=7 안에서는 실제 테이블로 넘어가서 fullscan을 하게 됨
어떻게하면 좋을지 생각해보자.
a,b를 하나로 묶어주는 index(a,b)를 만들어 보자
- INDEX(a,b)에는 a뿐만아니라 b정보도 가지고 있음
- a가 우선순위가 높고 a값의 크기를 먼저 오름차순으로 나열하고 나중에 b 값을 오름차순으로 나열
- 마찬가지로 a=7값을 만족하는 부분을 찾을때 까지 크기비교를 함
- INDEX(a)와는 다르게 b에 관한 정보도 INDEX(a,b)에 있으므로 b=95를 만족할때 까지 크기비교를 함
조건에 맞게 INDEX를 만들어 사용해야 좋은것!
만약 b=95를 찾으려고 한다면 ?
b에 관한 정보만으로는 정렬되어 있지 않기 때문에 제대로된 성능이 나오지 않음 => 이럴경우는 b에관한 index를 따로 만들어야함
그러면 index는 많이 만들수록 좋은것 아닌가?..
index를 만들면 이런 별도의 데이터들이 존재하게 됨
-> 두가지 염두해야할 포인트가 생김
table에 write 할 때마다 index 변경 발생
여기서 write는 insert, update, delete를 말함
TABLE에 데이터를 추가하거나 업데이트 혹 삭제할 경우 각각에 index에도 데이터를 최신화 시켜야함
추가적인 저장 공간 차지
- team_id를 조건으로 하는 조건문이 있을 경우 위 index에서 해결이 가능
-> 굳이 team_id만을 위한 index(team_id)를 만들필요가 없다는 의미 ( 저장 공간의 낭비, 성능향상 X )