mysql - 查询成本是 MySQL 查询优化的最佳指标吗?

标签 mysql query-optimization

我正在优化我的 MySQL 数据库中的查询。在使用 Visual Explain 并查看各种查询成本时,我反复发现违反直觉的值。使用更高效查找的操作(例如键查找)似乎比表面上效率较低的操作(例如全表扫描或全索引扫描)具有更高的查询成本。

这方面的例子甚至可以在 MySQL 手册中看到,在 this page 上有关 Visual Explain 的部分中: enter image description here 全表扫描的查询成本是基于键查找的查询成本的一小部分。我在自己的数据库中看到了完全相同的场景。

所有这一切对我来说似乎完全倒退,并提出了这个问题:我应该使用查询成本作为优化查询时的标准吗?还是我从根本上误解了查询成本?

最佳答案

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/

相关文章:

c# - 读取sql cel,查找行ID并更新同一行中的单元格

mysql - 当 CASE 不存在时,SQL 计数返回 0

php - 使用 PHP 从数据库中预填充 token 输入文本框中的值

针对游戏的mysql查询优化

针对最大值的 MySQL 查询优化

mysql - 更新/更改 mysql 中字符串的特定部分?

php - 将 Android 设备连接到 Apache 服务器

oracle - 在Oracle中使用ANSI数据类型是否有性能损失?

mysql - 即使索引看似正确且内存充足,查询运行时间也太长

sql - 相同的查询 - 不同的执行计划