효율적인 Query Tuning: DB Index 설정 시 알아두면 좋은 팁
DB table Index에 대한 팁 몇가지
Query Tunning 공부를 해 나가고 있는데 이 과정에서 배운 DB Table Index에 대한 몇가지 꿀팁이 있어서 정리하고자 한다!
1. DB table Index 를 만들때 순서는?
DB 의 Table 에 Index를 만들때 데이터를 먼저 다 넣고 index를 지정해야할까 아니면 index설정을 한 이후에 데이터를 넣어야 할까?
정답은! 데이터를 먼저 넣어야한다!
Index를 만들게 되면 B+ tree가 만들어지는데 이미 만들어 진 상태에서 데이터를 집어 넣다보면 balanced tree가 아니게 될 수 있다. 처음에 데이터를 넣고 난 다음 생성을 하면 balanced tree가 되어 데이터를 뽑아 내는 것에 이득을 볼 수 있다!
2. Where 절에 있다고 무조건 인덱싱을 해야할까?
물어보는 뉘앙스에서부터 벌써 아닌게 들통이 났지만 암튼 무조건 인덱싱이 속도를 빠르게 하는 방법은 아니다.
1
2
3
select *
from sampleTable
where channel = 4 -- channel은 인덱스
에서 sampleTable 내부 데이터 개수는 500k 이고 channel이 4인 친구는 300k개나 있다고 생각하면 계속해서 Index 를 통해서 찾아내야 하기 때문에 오히려 Full Scan보다 성능이 좋지 않다. 따라서 내가 뽑아내려고 하는 데이터의 총량이 극히 소량 (대략 4% 안쪽이라고 하지만 이것도 무조건 적인건 아니다 따라서 실행계획을 직접 꺼내봐야한다!) 이라면 index를 적용하는 것을 고민해 보아야한다.
3. 극히 소량이라고 하더라도 각기 다른 블럭에 있다면 성능이 좋지 않다.
한번에 디스크에서 블럭씩 가져오게 되는데 극히 소량들이 다들 다른 블럭에 들어가있으면 블럭 다가져오고 하면 시간이 꽤 걸리게 될 것이다. 새로운 데이터가 계속 추가되고 그러면서 이런 경우가 생길 수 있을거같다. 따라서 이런 경우에는 테이블 파티셔닝! 혹은 다시 table을 만들어 데이터를 넣어주고 인덱스 설정을 해버리면 쭉 정렬이 된다!
어렵다
DB의 세계는 어렵다. 특히 안에서 무슨일이 일어나는지 확실히 알 수가 없으니까 더 어려운거 같지만… 자잘한것 몇가지만 알아도 우리 Q&A플랫폼의 속도를 크게 향상 시킬수 있지 않을까 생각한다!