본문 바로가기
C.W.K.
Stream
Lesson 05 of 10 · published

Covering Index

~12 min · indexes, covering, performance

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Query가 테이블을 아예 안 건드려

Covering index는 query가 필요로 하는 컬럼을 전부 품고 있는 인덱스야. WHERE 절에 쓰는 것도, SELECT list에 있는 것도 다. 그러면 SQLite가 main 테이블을 아예 안 건드리고 인덱스 B-tree만으로 답을 내. EXPLAIN QUERY PLAN이 USING COVERING INDEX라고 알려주지.

query를 덮는 방법은 둘이야.

  • composite 인덱스에서 거르는 컬럼 뒤에 SELECT하는 컬럼을 덧붙이기.
  • SQLite의 표현식 인덱스로, 자주 SELECT하는 계산값을 미리 뽑아두기.
Warning: 인덱스가 넓어지면 write 부담과 디스크 사용량이 같이 올라가. Covering은 정밀 도구지 기본값이 아니야. 뜨겁다고 확인된 query에만 쓰고, 모든 query에 깔아두지는 마.

Code

Plain vs covering·sql
-- Plain — 인덱스가 WHERE 도움, SELECT 는 테이블 읽음
CREATE INDEX idx_msg_conv ON messages(conversation_id);

EXPLAIN QUERY PLAN
SELECT id, role, created_at FROM messages WHERE conversation_id = 1;
-- 0|0|0|SEARCH messages USING INDEX idx_msg_conv (conversation_id=?)

-- Covering — 인덱스가 query 필요한 모든 컬럼 가짐
CREATE INDEX idx_msg_conv_cover
  ON messages(conversation_id, role, created_at, id);

EXPLAIN QUERY PLAN
SELECT id, role, created_at FROM messages WHERE conversation_id = 1;
-- 0|0|0|SEARCH messages USING COVERING INDEX idx_msg_conv_cover ...

External links

Exercise

EXPLAIN이 SEARCH ... USING INDEX라고 말한 query를 하나 잡아. SELECT하는 컬럼까지 품는 covering 인덱스를 만들어서 EXPLAIN이 USING COVERING INDEX로 바뀌는지 확인해. 그리고 지금 row 수와 데이터 크기에서 실제로 시간이 줄었는지도 재봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.