我会很感激有人如何解释我这个案例http://pastebin.com/YBQTwxYG,两个查询几乎相同,但第二个执行ms除了前几乎3分钟。
由于EXPLAIN显示第二个查询使用了正确的索引,但首先不是。
我很困惑。
答案 0 :(得分:0)
首先是一些格式化:
SELECT c.`id`, c.`content_id`, c.`author_id`, c.`text`, c.`typotext`,
c.`created`,
p.`id`, p.`html_title`, p.`permalink`,
u.`id`, u.`username`, u.`first_name`, u.`last_name`, u.`avatar`
FROM `content_comment` AS c
INNER JOIN `content_post` AS p ON (c.`content_id` = p.`id`)
INNER JOIN `post_article` AS a ON (p.`id` = a.`content_id`)
LEFT OUTER JOIN `auth_user` AS u ON (c.`author_id` = u.`id`)
WHERE c.`deleted` IS NULL
AND a.`id` IS NOT NULL
ORDER BY c.`created` DESC
LIMIT 15
如果id
是PRIMARY KEY
的{{1}},那么它不能是post_article
。因此,测试是不必要的。
如果您打算测试NULL
。auth_user
,则不需要id
。
然后检查您是否有这些复合索引:
LEFT
第二个查询与不同,因为它访问c: INDEX(deleted, created) -- in that order
a: INDEX(content_id, id) -- in that order
而不是forum_topic
。看看这两个表的auth_user
可以解释为什么你有不同的解释计划。如果没有,请检查SHOW CREATE TABLE
。
如果您需要进一步讨论,请为所有5个表格提供SHOW TABLE STATUS
。