0

假设我有一个student表包含id, class,school_id有 1000 条记录。

有3所学校和12个班级。

这两个查询中的哪一个会更快(如果有差异)

查询一:

SELECT * FROM student WHERE school = 2 and class = 5; 

查询 2:

SELECT * FROM student WHERE class = 5 and school = 2;

注意:我只是更改了 2 个条件的位置WHERE

那么哪个会更快,以下是真的吗?

-> query1 中的可能记录数为 333

-> query2 中的可能记录数为 80。

4

5 回答 5

6

一点点都没有关系。1000 条记录是一个真正的小型数据库表,如果有任何差异,您需要从这种脑死亡的 DBMS 升级。

一个体面的 DBMS 应该已经从表中收集了统计信息(或者 DBA 会作为定期调整的一部分来完成),并且where子句的顺序是无关紧要的。

执行引擎将选择最快减少基数(即减少候选行组)的引擎。这意味着(假设班级和学校大致均匀分布)class = 5过滤器将首先发生,无论select语句中的顺序如何。

更深入地解释基数问题,对于这 1000 条记录的大致均匀分布,每所学校将有 333 条记录,每个班级将有 83 条记录。

DBMS 将首先过滤给您最小结果集的内容。所以它倾向于使用类过滤器。这会立即将候选行列表减少到大约 83 行。然后,只需将那些拥有除 2 之外的学校的人扔掉就很简单了。

在这两种情况下,您最终都会得到相同的最终行集,但初始过滤器通常更快,因为它可以使用索引来仅选择所需的行。另一方面,第二个过滤器很可能以较低效率的方式遍历这些行,因此您可以越快减少行数越好。

如果你真的想知道,你需要测量而不是猜测。这是 DBA 的主要职责之一,调整数据库以优化查询执行。

于 2012-08-28T06:55:02.953 回答
5

这两个查询完全相同:)

于 2012-08-28T06:54:22.890 回答
2

假想; 教授 DB 概念

“您的数据库如何使用基数优化您的查询”

因此,它们基本上是相同的,但我会提到一个暗示“为什么”的想法,这实际上会引入一个好的 RDBMS 概念。

我们假设您的 RDBMS严格按照您指定的顺序使用 WHERE 子句。

在这种情况下,最佳查询将是首先指定具有最大基数的列的查询。这意味着class=5首先指定会更快,因为它会更快从考虑中排除行,这意味着如果行的“类”列不包含 5(这在统计上比不包含 2 的“学校”列更有可能),那么它甚至不需要评估“学校”列。

然而,回到现实,您应该知道,几乎所有现代关系数据库管理系统都执行所谓的“构建查询计划”和“编译查询”。这包括评估 WHERE 子句中指定的列的基数(以及可用的索引等)。所以本质上,说它们是相同的可能是正确的,结果的数量也将是相同的。

于 2012-08-28T06:59:04.717 回答
1

受影响的行数不会也可能不会仅仅因为您对 sql 语句的“where 子句”中的条件重新排序而改变。执行时间也不会受到影响,因为 sql-server 将首先查找匹配的索引。

于 2012-08-28T06:56:52.863 回答
-2

第一个查询比第二个查询执行得更快,因为在 where 子句中它首先过滤学校,因此以后更容易获取班级详细信息

于 2012-08-28T06:57:28.313 回答