2

假设我有一个这样的 MySQL 查询,表PEOPLE有大约 200 万行:

SELECT * FROM `PEOPLE` WHERE `SEX`=1 AND `AGE`=28;

第一个条件将返回 100 万行,第二个条件可能返回 20,000 行。在本地网站上,大多数开发人员表示,更改它们的顺序会产生更好的效果。他们还说2 million + 1 million + *10,000*如果更改顺序会导致 I/O 时间,而上面的原始查询会导致2 million + 20,000 + *10,000*I/O 时间。听起来很有道理。

众所周知,MySQL 有一个用于此类工作的内部查询优化器。订单是否需要特别注意以获得最佳性能?我完全糊涂了。

PS:我注意到已经有一些类似的问题被问过,但它们是两年前还是树,最好再问一次。


谢谢大家注意到这个问题。这是关于我为什么再次问的解释:

在我问这个问题之前,我运行了几次 EXPLAIN。答案是顺序无关紧要。但是面试官告诉我订单会影响性能,我想确定是否有我遗漏的东西。

4

1 回答 1

1

您首先应该了解一个基本的东西:理论上,关系数据库没有索引

纯粹理论上的关系数据库引擎确实会扫描所有记录,检查sexage列上的标准并仅返回相关行。

但是,索引是 SQL 数据库引擎添加的一个通用层,用于更快地过滤行。在这种情况下,您应该对这两列都有索引。

更重要的是,这些相同的数据库引擎对这些索引(如果有)执行分析,以确定更快地检索相关行的最佳可能操作过程。特别是,索引元数据中的一个标准是基数:对于索引列的给定值,平均有多少行匹配?行数越高,基数越低。因此,基数越高越好。

因此,SQL 引擎的查询优化器肯定会选择先查找age索引,然后再查找sex. 如果仅通过查找第一个过滤器产生的每一行的列值来确定它可以更快,它甚至可能选择根本不使用索引。这很可能在这里,因为该列的基数低得离谱。sexsexsex

在这里查看关系模型的介绍。

于 2013-07-10T08:48:34.023 回答