2012-02-02 4 views
1

Mysql использует индекс на (faver_profile_id, deleted, notice_id), когда он должен использовать индекс (faver_profile_id, удален, id). Странно, что для некоторых значений faver_profile_id он использует правильный индекс. Я могу использовать FORCE INDEX, который значительно ускоряет запрос, но я хотел бы выяснить, почему mysql делает это.Почему Mysql использует неверный индекс?

Это новая таблица (35-метровые строки), скопированная из другой таблицы с использованием INSERT INTO .. ​​SELECT FROM. После этого я не запускал OPTIMIZE TABLE или ANALYZE. Может ли это помочь?

SELECT `Item`.`id` , `Item`.`cached_image` , `Item`.`submitter_id` , `Item`.`source_title` , `Item`.`source_url` , `Item`.`source_image` , `Item`.`nudity` , `Item`.`tags` , `Item`.`width` , `Item`.`height` , `Item`.`tumblr_id` , `Item`.`tumblr_reblog_key` , `Item`.`fave_count` , `Item`.`file_size` , `Item`.`animated` , `Favorite`.`id` , `Favorite`.`created` 
FROM `favorites` AS `Favorite` 
LEFT JOIN `items` AS `Item` ON ( `Favorite`.`notice_id` = `Item`.`id`) 
WHERE `faver_profile_id` =11619 
AND `Favorite`.`removed` =0 
AND `Item`.`removed` =0 
AND `nudity` =0 
ORDER BY `Favorite`.`id` DESC 
LIMIT 26 

план выполнения запроса: "idx_notice_id_profile_id" индекс по (faver_profile_id, снятом notice_id)

1 | SIMPLE  | Favorite | ref | idx_faver_idx_id,idx_notice_id_profile_id,notice_id_idx | idx_notice_id_profile_id | 4  | const,const       | 15742 | Using where; Using filesort | 
1 | SIMPLE  | Item  | eq_ref | PRIMARY             | PRIMARY     | 4  | gragland_imgfave.Favorite.notice_id |  1 | Using where  
+0

вы должны приложить план выполнения – ajreal

+0

@ajreal хорошо добавляемые выше. – makeee

ответ

0

Я не знаю, если его причиной путаницы или нет, но, может быть, по перемещение некоторых квалификаторов И в соединение элемента могло бы помочь, поскольку оно напрямую коррелировало с ITEM, а не с любимым. Кроме того, я явно ссылался на таблицы table.field, где они отсутствовали.

SELECT 
     Item.id, 
     Item.cached_image, 
     Item.submitter_id, 
     Item.source_title, 
     Item.source_url, 
     Item.source_image, 
     Item.nudity, 
     Item.tags, 
     Item.width, 
     Item.height, 
     Item.tumblr_id, 
     Item.tumblr_reblog_key, 
     Item.fave_count, 
     Item.file_size, 
     Item.animated, 
     Favorite.id, 
     Favorite.created 
    FROM favorites AS Favorite 
    LEFT JOIN items AS Item 
     ON Favorite.notice_id = Item.id 
     AND Item.Removed = 0 
     AND Item.Nudity = 0 
    WHERE Favorite.faver_profile_id = 11619 
    AND Favorite.removed = 0 
    ORDER BY Favorite.id DESC 
    LIMIT 26 

Итак, из таблицы «Избранное», ее критерии явно до faver_profile_id, удален, идентификатор (для заказа)

+0

Пробовал ваше предложение и, к сожалению, по-прежнему использует неверный индекс. – makeee

Смежные вопросы