通常我会通过
检查我的sql-statemensEXPLAIN 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结果。我无法粘贴代码,因为它太长了。
答案 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