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
答案 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)