为什么Mysql使用了错误的索引?

时间:2012-02-02 18:02:22

标签: mysql

Mysql正在使用索引(faver_profile_id,removed,notice_id)时应该使用索引(faver_profile_id,removed,id)。奇怪的是,对于某些faver_profile_id值,它确实使用了正确的索引。我可以使用FORCE INDEX来大大加快查询速度,但我想弄清楚为什么mysql会这样做。

这是一个使用INSERT INTO从另一个表复制的新表(35m行).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,removed,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    

1 个答案:

答案 0 :(得分:0)

我不知道它是否引起任何混淆,但可能通过将一些AND限定符移动到Item的连接可能会有所帮助,因为它与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,removed,id(for order)