56

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

我想为构造查询的预期性能添加某种形式的合理/启发式预测——有时用户无意中进行了不可避免地需要很长时间的查询(因为他们会返回巨大的结果集,或者因为他们'重新“违背”数据库索引的方式),我希望能够向用户显示一些“有点可靠”的信息/猜测查询需要多长时间。它不一定是完美的,只要它不会变得如此糟糕和频繁地与现实脱节,以至于导致用户学会无视它的“哭狼”效应;-) 基于此信息,用户可能决定去喝杯咖啡(如果估计是 5-10 分钟),去吃午饭(如果是 30-60 分钟),

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

任何指针...?

4

3 回答 3

22

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

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

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

于 2009-04-25T19:10:24.237 回答
11

我认为,如果您想有机会从中构建一些相当可靠的东西,您应该做的是根据表大小和分解的与查询处理时间相关的 EXPLAIN 结果组件构建一个统计模型。尝试基于对 EXPLAIN 内容的思考来构建查询执行时间预测器只会花费太长时间,在它变得模糊有用之前给出令人尴尬的糟糕结果。

于 2009-04-25T19:12:38.770 回答
3

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

使用索引的查询通常可以安全使用,因为数据库设计者在设计数据库时可能会考虑这些查询。

然而

还有一个字段叫做Extra. 此字段有时包含文本using_filesort

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

结论

无需尝试预测查询所需的时间,只需查看这两个指标即可。如果查询是using_filesort,则拒绝该用户。并且根据您想要的严格程度,如果查询没有使用任何键,您也应该拒绝它。

阅读有关MySQL EXPLAIN 语句结果集的更多信息

于 2015-11-09T13:33:32.397 回答