order by 와 limit을 꼭 써야해서 커버링 인덱스 작업을 하였습니다.
===============================
item테이블
id (int)
flag (int)
===============================
item_p 테이블
idx(시퀀스) int
item_idx (item테이블에 관계키) int
tag(텍스트) varchar 255
sort(순서) int
created_at(만든날) datetime
============================================
SELECT B.* FROM (
SELECT idx FROM item_p a
WHERE tag REGEXP 'bus|car'
) A
INNER JOIN item_p B
ON A.idx = B.idx
ORDER BY B.sort DESC,B.created_at DESC
LIMIT 8
============================================
SELECT B.* FROM (
SELECT idx FROM item_p a
WHERE tag REGEXP 'bus|car'
INNER JOIN item b
ON a.item_idx = b.id
AND b.flag= 1
) A
INNER JOIN item_p B
ON A.idx = B.idx
ORDER BY B.sortDESC,B.created_at DESC
LIMIT 8
커버링 인덱스로 위 질의를 하였을떄 왜 위에 절은 인덱스를 타고 밑에 쿼리는 인덱스를 안타는걸까요?
혹시 안된다면 위 첫번째 결과에 부모테이블에 flag가 1인것만 인덱스를 order by limit 을태워서 가져올수 있게 방법이 있을까요
참고로 위에 플래그나 정렬 칼럼 tag, 관계키는 모두 인덱스로 설정이 되어있습니다.
정렬순서와 검색조건이 불일치합니다.
이 경우 인덱스를 타는것이 과연 좋은지 의문이네요.
flag=1 조건이나
tag REGEXP 'bus|car' 조건이 인덱스를 이용하기 좋은 조건인지 의문이네요?
각조건에 대한 분포도가 어찌 되나요?
- item 의 총건수 대비 flag=1 의 건수는?
- item_p 의 총건수 대비 tag REGEXP 'bus|car' 의 건수는?
- 조인시 두조건을 모두 만족하는 건수는?
인덱스로 정렬하려면
이퀄 검색조건을 선행으로 하고 정렬항목이 후행으로 오는 결합인덱스여야 합니다.
커버링인덱스란?
인덱스만 읽고 결과도출이 가능한 경우입니다.
그러기 위해서는 조회 항목들을 모조리 결합인덱스로 만들어야 합니다.
제시하신 인덱스는 결합인덱스가 아니라 각개전투하는 인덱스들 이네요.