【发布时间】:2017-08-17 16:25:21
【问题描述】:
我正在优化我的 MySQL 数据库中的查询。在使用 Visual Explain 并查看各种查询成本时,我反复发现违反直觉的值。使用更高效查找的操作(例如键查找)似乎比表面上效率较低的操作(例如全表扫描或全索引扫描)具有更高的查询成本。
这方面的示例甚至可以在 MySQL 手册中的 this page 上有关 Visual Explain 的部分中看到: 全表扫描的查询成本是基于键查找的查询成本的一小部分。我在自己的数据库中看到了完全相同的场景。
这一切对我来说似乎完全倒退了,并提出了一个问题:在优化查询时,我应该使用查询成本作为标准吗?还是我从根本上误解了查询成本?
【问题讨论】:
-
归根结底,“实际性能”通常是最重要的。估计的(和实际的)查询计划很好。另一方面,让相关查询快速运行通常是一项要求。
-
另外,我不确定问题是什么 - 基本 FTS 的成本本身没有意义,因为它只是回答查询所需信息的一部分。 (如果表有适当的索引和数据量,它应该从完全扫描更改为索引扫描:这一步实际上只是“构建初始 N [1000] 行”。在这种情况下,计划者认为表足够小或没有可用的索引。)
-
我了解查询的每个步骤在做什么以及它是如何做的。我不明白的是,查询规划器几乎无一例外地认为索引读取比非索引读取更昂贵,而常识会告诉您其他情况。例如,在我的数据库中,我发现一个查询正在执行全表扫描,所以我添加了一个适当的索引,然后规划器选择了该索引,但 EXPLAIN 显示查询成本在该更改之后上升。