假设我有这样的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。答案是顺序无关紧要。但是采访者告诉我,订单会有所不同,我想确定是否有遗漏的东西。
答案 0 :(得分:1)
首先应该理解一个基本的东西:理论上,关系数据库没有索引。
纯理论关系数据库引擎确实会扫描所有记录,检查sex
和age
列上的标准,并仅返回相关行。
但是,索引是SQL数据库引擎添加的公共层,可以更快地过滤行。在这种情况下,您应该拥有这两列的索引。
此外,这些相同的数据库引擎对这些索引(,如果有的话)执行分析,以确定更快地检索相关行的最佳行动方案。特别是,索引元数据中的一个标准是cardinality:对于索引列的给定值,平均有多少行匹配?行数越多,基数越低。因此,基数越高越好。
因此,SQL引擎的查询优化器肯定会选择通过首先查找age
索引来切换结果集,然后只查找sex
的索引。它甚至可以选择不来使用sex
上的索引,只要它通过查找每行的sex
列值来确定它可以更快。第一个过滤器。这可能就在这里,因为sex
列的基数非常低。
看看here,了解关系模型的介绍。