인덱스는 공짜 아냐
인덱스는 하나 붙일 때마다 write를 느리게 만들고 디스크를 먹어. INSERT든 UPDATE든 DELETE든 인덱스까지 같이 고쳐야 하니까. 값어치를 하고도 남는 인덱스만 정확히 골라 만드는 게 기술이야.
인덱스를 붙일 때는 이래.
- 큰 테이블에서
WHERE,JOIN,ORDER BY에 자주 등장하는 컬럼. - 값이 다양해서 selectivity가 높은 컬럼.
- FK. 이건 거의 무조건 붙여.
반대로 안 붙이는 게 맞을 때도 있어.
- 테이블이 작을 때. 수천 개도 안 되면 전부 훑는 게 인덱스를 타는 것보다 빨라.
- selectivity가 낮을 때. boolean 같은 컬럼이 그래. 이럴 땐 partial 인덱스를 써.
- 그 컬럼으로 거의 거르지도 join하지도 않을 때.
- write가 많은데 그 인덱스가 뜨거운 query에서 안 쓰일 때.
Warning: 인덱스는 계속 손봐줘야 하는 짐이야. 안 쓰는 인덱스, 겹치는 인덱스, 2년 전 버그 하나 때문에 급하게 붙인 인덱스를 다시 들여다보는 게 정상적인 DB 관리야.
SELECT name FROM sqlite_schema WHERE type='index' AND tbl_name='X'가 그 점검의 출발점이고.