EXPLAIN SELECT结果的说明

时间:2013-12-26 20:29:00

标签: mysql

通常我会通过

检查我的sql-statemens
EXPLAIN SELECT ...

今天我尝试了试用版“Jet Profiler for mysql”,它向我展示了这个查询的以下解释

SELECT   c.categories_id,
         cd.categories_name
FROM     categories c
JOIN     categories_description_de cd ON c.categories_id = cd.categories_id
WHERE    c.parent_id = 0
AND      c.categories_status = 1
AND      c.group_permission_1 = 1 
ORDER BY c.sort_order,
         cd.categories_name

不幸的是我无法理解。

这是命令行的EXPLAIN结果。我无法粘贴代码,因为它太长了。 enter image description here

2 个答案:

答案 0 :(得分:1)

在这里解释EXPLAIN的所有输出太多了,而且你没有具体说明你在理解它的哪一部分。

除了@dg99链接到MySQL手册之外,还有其他资源可用于理解EXPLAIN。我的公司Percona在这方面做了很多演讲。我们有许多在线网络研讨会,可以免费查看,但需要注册。

简而言之,这是我在EXPLAIN输出中看到的内容:

  • 优化程序会考虑categories的几个索引,但我认为它们中的任何一个都不是最适合此查询的索引。理想情况下,您可以使用索引来减少搜索,以便仅匹配您希望在结果集中显示的行。
  • 其次,使用索引以预先排序的顺序检索行,这样您就不必在每次查询期间承担该成本。每个查询排序由using filesort表示。
  • 用于categories_description_de的索引是主键索引。你唯一能做得更好的是将描述放入主categories表中,并避免加入。
  • 我会在(parent_id, categories_status, group_permission_1, sort_order)上选择一个复合索引。
  • 我建议你ORDER BY c.sort_order而不是从另一个表中的第二列排序。第二个排序列导致查询为using temporary table,这意味着它必须先收集完整结果才能对其进行排序。这通常是性能下降的原因。

PS:如果你有复制品,可以更容易看到你的EXPLAIN输出。粘贴文本而不是屏幕截图。我必须下载图像并离线查看,以便它可读。

答案 1 :(得分:0)

以下是您想要了解的有关EXPLAIN输出的所有信息:http://dev.mysql.com/doc/refman/5.5/en/explain-output.html