인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조이다. 쉽게 예를 들면, 책에 있는 목차라고 생각하면 된다.
써놓은 목차를 활용하기 위함
여러 인덱스를 걸었을때, 현재 컬럼이 범위 조건으로 들어간다면 다음 컬럼부터는 인덱스가 사용되지 않는다고 하므로 주의하자.
카디날리티(Cardinality)란 해당 컬럼의 중복된 수치이다. 예를 들어, 성별이나 나이는 카디날리티가 낮고, 주민번호 등은 카디날리티가 높다고 한다.
인덱스로 많은 부분을 더더욱 많은 부분을 걸러내기 위해선, 분포도가 높은 (카디날리티가 높은) 컬럼을 인덱스로 잡아야 한다.
대략 35만여개의 데이터가 들어있는 테이블에 테스트를 해보았다. 용량은 대략 24MB정도 된다.
공정한 비교를 위해, 적용 전과 후는 DB 조회 캐시를 삭제하지 않은 채 진행하였다.
166ms 정도 소요된다! (200 row는 표시되는 한 페이지 갯수라 총 데이터수 랑은 관계없음)
day 컬럼의 목차를 위해 DAY_INDEX 이름의 인덱스를 생성해준다.
68ms가 소요되었다.
이 정도의 데이터량만으로도 약 2.5배의 성능 향상을 내는 것 같다!
인덱스 적용 전
인덱스 적용 후
-> type이 ref로 변화했다. 인덱스를 이용하여 효과적으로 비교했다는 뜻이다. 또한, 옆에 key로 우리가 만들었던 DAY_INDEX를 사용했다고 한다.
데이터가 1만개만 넘어도 인덱스가 필수적이며, 많이 체감된다고 한다. 한번 자신의 DB에 직접 적용시켜보자.
https://jojoldu.tistory.com/243
https://www.burndogfather.com/238
https://coding-factory.tistory.com/746