如何使用EXPLAIN *预测MySQL查询的性能?

时间:2009-04-25 19:00:07

标签: mysql sql-execution-plan

我正在帮助维护一个程序,该程序本质上是一个大而复杂的MySQL数据库的友好只读前端 - 该程序从用户输入构建临时SELECT查询,将查询发送到数据库,获取结果,对它们进行后处理,并将它们很好地显示给用户。

我想为构造的查询的预期性能添加某种形式的合理/启发式预测 - 有时用户无意中进行不可避免地需要花费很长时间的查询(因为它们将返回大量结果集,或者因为它们“与数据库索引方式相差甚远”,我希望能够向用户显示一些“有些可靠”的信息/猜测查询将花费多长时间。它不一定是完美的,只要它不会如此糟糕,经常与现实打成一团,导致用户学会忽视它的“哭狼”效果;-)基于此信息,用户可能决定去喝咖啡(如果估计是5-10分钟),去吃午餐(如果是30-60分钟),杀死查询并尝试其他方式(可能对他们要求的信息有更严格的限制) )等等。

我对MySQL的EXPLAIN语句不是很熟悉 - 我看到很多关于如何使用它来优化查询或数据库模式,索引等的信息,但不是很多关于如何将它用于我更有限的目的 - 简单地进行预测,将DB作为给定(当然如果预测足够可靠,我可能最终切换到使用它们也可以在查询可以采用的替代形式之间进行选择,但是,这是为了未来:现在,为了上述目的,我只是为了向用户展示性能猜测而感到高兴。)

任何指针......?

3 个答案:

答案 0 :(得分:20)

EXPLAIN不会告诉您查询需要多长时间。 最多你可以用它来猜测哪两个查询可能更快,但除非其中一个明显写得不好,否则即使这样也会非常困难。

您还应该知道,如果您使用子查询,即使运行EXPLAIN也可能很慢(在某些情况下几乎与查询本身一样慢)。

据我所知,MySQL没有提供任何方法来估计查询运行所需的时间。您可以记录每个查询运行的时间,然后根据过去类似查询的历史记录构建估算值吗?

答案 1 :(得分:11)

我认为如果您希望有机会构建一些相当可靠的东西,那么您应该做的是根据表格大小和与查询处理时间相关的细分EXPLAIN结果组件构建统计模型。尝试构建一个基于思考 EXPLAIN内容的查询执行时间预测器,只是花费太长时间才能得到令人尴尬的糟糕结果,然后才能使其变得模糊有用。

答案 2 :(得分:3)

MySQL EXPLAIN有一个名为Key的列。如果此列中有某些内容,则这是一个非常好的指示,这意味着查询将使用索引。

使用标记的查询通常可以安全使用,因为数据库设计人员在设计数据库时可能会想到这些查询。

<强>然而

还有另一个名为Extra的字段。此字段有时包含文字using_filesort

非常非常坏。这实际上意味着MySQL知道查询的结果集大于可用内存,因此将开始将数据交换到磁盘以对其进行排序。

<强>结论

不要试图预测查询所需的时间,而只需查看这两个指标。如果查询为using_filesort,则拒绝该用户。根据你想要的严格程度,如果查询没有使用任何键,你也应该否认它。

详细了解MySQL EXPLAIN statement

的结果集