mysql 쿼리 인덱스 질문 0 4 3,115

by erea [MySQL] mysql index 커버링 self join [2016.10.10 18:03:05]


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, 관계키는 모두 인덱스로 설정이 되어있습니다.

 

by erea [2016.10.10 18:05:16]

최후의 방법으로 부모테이블에 flag를 자식테이블에 넣는방법까지 고려중입니다 ㅠㅠ


by 마농 [2016.10.10 18:56:59]

질문의 쿼리가 부정확하네요.
From 절에는 a, b 뿐인데 소트는 t. 으로 하네요.
또, 테이블 내역에 없는 항목도 보이네요? select_weight
커버링 인덱스 작업을 어찌 하신건지? 상세 내역이 없네요.
인덱스 내역을 보여주세요.


정렬순서와 검색조건이 불일치합니다.
이 경우 인덱스를 타는것이 과연 좋은지 의문이네요.


by erea [2016.10.11 08:58:10]

쿼리를 제가 잘못썻네요

인덱스 내역은

A테이블은

PRIMARY KEY (`id`),

KEY `ltem_idx` (`flag`)

이고

B테이블은

PRIMARY KEY (`idx`),

KEY `weight_idx` (`sort`,`created_at`)

KEY `uk_tag` (`tag`(255)),

KEY `fk_item_idx` (`item_idx`) 입니다

검색조건은 A로 정렬을 B로 할떄 인덱스를 탈수있는 방법이 있을까요?

 

 


by 마농 [2016.10.11 16:01:52]

정렬순서와 검색조건이 불일치합니다.
이 경우 인덱스를 타는것이 과연 좋은지 의문이네요.
flag=1 조건이나
tag REGEXP 'bus|car' 조건이 인덱스를 이용하기 좋은 조건인지 의문이네요?
각조건에 대한 분포도가 어찌 되나요?
 - item 의 총건수 대비 flag=1 의 건수는?
 - item_p 의 총건수 대비 tag REGEXP 'bus|car' 의 건수는?
 - 조인시 두조건을 모두 만족하는 건수는?


인덱스로 정렬하려면
이퀄 검색조건을 선행으로 하고 정렬항목이 후행으로 오는 결합인덱스여야 합니다.


커버링인덱스란?
인덱스만 읽고 결과도출이 가능한 경우입니다.
그러기 위해서는 조회 항목들을 모조리 결합인덱스로 만들어야 합니다.
제시하신 인덱스는 결합인덱스가 아니라 각개전투하는 인덱스들 이네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입