쿼리문은 같은데 where value만 다를때 인덱스가 완전히 다르게 타는 이유가 뭘까요? 0 2 717

by 음미 [SQL Query] MySQL 인덱스 [2021.08.12 21:47:57]



SELECT `bulbs`.* FROM `bulbs` INNER JOIN `likes` ON `bulbs`.`id` = `likes`.`target_id` 
WHERE `likes`.`user_id` = (유저번호) AND `likes`.`target_type` = 'Bulb'

안녕하세요. 쿼리문은 같은데 where value만 다를때 인덱스가 완전히 다르게 타는 케이스가 있어서 혹시 짐작가시는 이유가 있을까 해서 여쭤보러 왔습니다 ㅜㅜ mysql 5.7을 사용하고 있습니다.
 

indexing은 (user_id, target_id, target_type)으로 설정되어있어요.

user_id가 23이 아니라 49 일때는 const로 인덱싱이 잘 타는데요.

id|select_type|table  |type|possible_keys                                                                                              |key                                                   |key_len|ref  |rows|Extra                                                        |
--+-----------+-------+----+-----------------------------------------------------------------------------------------------------------+------------------------------------------------------+-------+-----+----+-------------------------------------------------------------+
 1|SIMPLE     | likes| ref | index_likes_on_user_id_and_target_id_and_target_type | index_likes_on_user_id_and_target_id_and_target_type| 4      | const|  21 | Using where; Using index                                     |

 

user_id 23일때는 인덱스 풀 스캔을 합니다.

id|select_type|table  |type |possible_keys                                                                                              |key                                                   |key_len|ref|Extra                                           |rows     |
--+-----------+-------+-----+-----------------------------------------------------------------------------------------------------------+------------------------------------------------------+-------+---+------------------------------------------------+---------+
 1| SIMPLE     | likes| index| index_likes_on_user_id_and_target_id_and_target_type | index_likes_on_user_id_and_target_id_and_target_type| 775    |   | Using where; Using index                        | 9356|

 

해당 23번 user가 like를 많이 한건가 싶어서 찾아봤더니 49번유저와 거의 비슷하게( 49번 유저는 21번, 21번 유저는23번) like를 했더라고요(인덱스 탈 column에 null 데이터도 없어요) 그런데, 23번 유저만 모든 테이블의 row를 다 스캔해서 매우 이상합니다.

혹시 짚이시는 원인이 있을까요? 키워드라도 알려주시면 열심히 찾아보겠습니다 ㅜㅜ

by 마농 [2021.08.17 10:51:04]

해당 ID 컬럼의 분포도가 고르지 않은 경우 다르게 탈 수 있습니다.
건수가 적은 유저의 경우엔 인덱스 스캔이 빠르지만
건수가 많은 유저의 경우엔 인덱스 스캔이 오히려 풀스캔보다 느릴 수도 있습니다.
유저별 건수를 확인해 보세요.
통계정보가 올바르지 않아 잘못된 정보를 바탕으로 잘못된 실행계획을 수립할 수도 있습니다.
통계정보를 갱신해 보세요.


by 음미 [2021.12.28 08:49:43]

감사합니다!

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