我正在优化我的 MySQL 数据库中的查询。在使用 Visual Explain 并查看各种查询成本时,我反复发现违反直觉的值。使用更高效查找的操作(例如键查找)似乎比表面上效率较低的操作(例如全表扫描或全索引扫描)具有更高的查询成本。
这方面的例子甚至可以在 MySQL 手册中看到,在 this page 上有关 Visual Explain 的部分中: 全表扫描的查询成本是基于键查找的查询成本的一小部分。我在自己的数据库中看到了完全相同的场景。
所有这一切对我来说似乎完全倒退,并提出了这个问题:我应该使用查询成本作为优化查询时的标准吗?还是我从根本上误解了查询成本?
最佳答案
MySQL 没有与优化相关的非常好的指标。一个更好的方法是 EXPLAIN FORMAT=JSON SELECT ...
,但它有点含糊。
一些“严重”的缺陷:
- 很少做任何事情来解释
LIMIT
。 - 指数的统计数据是粗略的,不允许分布不均。 (直方图“即将”推出。)
- 关于数据/索引当前是否被缓存的研究很少,也没有关于您是否有旋转驱动器或 SSD 的研究。
我喜欢这个,因为它让我可以比较两个公式/索引/等,即使对于时间几乎无用的小表也是如此:
FLUSH STATUS;
perform the query
SHOW SESSION STATUS LIKE "Handler%";
它提供读取、写入(临时表)等的精确计数(与EXPLAIN
不同)。它的主要缺陷是不区分读取/写入的时间长度采取了(由于缓存、索引查找等)。但是,它通常非常擅长指出查询是执行表/索引扫描还是查找还是多次扫描。
常规 EXPLAIN
无法指出多个排序,例如 GROUP BY
和 ORDER BY
。并且“使用文件排序”并不一定意味着将任何内容写入磁盘。
关于mysql - 查询成本是 MySQL 查询优化的最佳指标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740439/