当前位置:  开发笔记 > 后端 > 正文

这个查询出了什么问题?EXPLAIN对我来说很好看

如何解决《这个查询出了什么问题?EXPLAIN对我来说很好看》经验,为你挑选了0个好方法。

我正在浏览一个应用程序,并试图优化一些查询,我真的在努力解决其中的一些问题.这是一个例子:

SELECT `Item` . * , `Source` . * , `Keyword` . * , `Author` . *
FROM `items` AS `Item`
JOIN `sources` AS `Source` ON ( `Item`.`source_id` = `Source`.`id` )
JOIN `authors` AS `Author` ON ( `Item`.`author_id` = `Author`.`id` )
JOIN `items_keywords` AS `ItemsKeyword` ON ( `Item`.`id` = `ItemsKeyword`.`item_id` )
JOIN `keywords` AS `Keyword` ON ( `Keyword`.`id` = `ItemsKeyword`.`keyword_id` )
JOIN `keywords_profiles` AS `KeywordsProfile` ON ( `Keyword`.`id` = `KeywordsProfile`.`keyword_id` )
JOIN `profiles` AS `Profile` ON ( `Profile`.`id` = `KeywordsProfile`.`profile_id` )
WHERE `KeywordsProfile`.`profile_id` IN ( 17 )
GROUP BY `Item`.`id`
ORDER BY `Item`.`timestamp` DESC , `Item`.`id` DESC
LIMIT 0 , 20;

这个花了10-30秒...在引用的表中,大约有500k作者行,大约750k项和items_keywords行.其他一切都少于500行.

这是解释输出:http: //img.skitch.com/20090220-fb52wd7jf58x41ikfxaws96xjn.jpg

EXPLAIN对我来说相对较新,但我逐行完成了这一切,看起来一切都很好.不知道我还能做什么,因为我已经掌握了所有的索引......我错过了什么?

它所处的服务器在slicehost上只有256个切片,但是没有其他任何东西在运行它并且CPU在运行之前为0%.然而它仍然在这个查询上.有任何想法吗?

编辑:一些进一步的信息; 使这真令人沮丧的一件事是,如果我反复运行此查询,则需要不到0.1秒.我假设这是由于查询缓存,但如果我在它之前运行RESET QUERY CACHE,它仍然运行得非常快.只有在我等待一段时间或运行其他一些查询后才会返回10-30秒.所有表都是MyISAM ...这是否表明MySQL正在将内容加载到内存中,这就是为什么它运行一段时间这么快?

编辑2:非常感谢大家的帮助......更新......我把所有内容都归结为:

SELECT i.id
FROM items AS i
ORDER BY i.timestamp DESC, i.id DESC
LIMIT 0, 20;

尽管数据库中只有750k记录,但始终需要5-6秒.一旦我在ORDER BY子句上删除了第二列,它就很快了.显然有几件事情在这里,但是当我将查询切换到这个时:

SELECT i.id
FROM items AS i
JOIN items_keywords AS ik ON ( i.id = ik.item_id )
JOIN keywords AS k ON ( k.id = ik.keyword_id )
JOIN keywords_profiles AS kp ON ( k.id = kp.keyword_id )
WHERE kp.profile_id IN (139)
ORDER BY i.timestamp DESC
LIMIT 20;

它还需要10秒以上......我还能做些什么?

轻微的好奇心:在解释中,items_keywords的rows列总是1544,无论我在查询中使用什么profile_id.它不应该根据与该配置文件关联的项目数量而改变吗?

编辑3:好的,这太荒谬:).如果我完全删除ORDER BY子句,事情就会非常迅速,临时表/ filesort会从explain中消失.item.timestamp列目前有一个索引,但是由于某些原因它没有被使用?我以为我记得一些关于mysql的东西只使用每个表或某个索引?我应该在这个查询引用的items表的所有列上创建一个多列索引(source_id,author_id,timestamp等)?

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有