假设我的student
表包含id
,class
,school_id
,其中包含1000条记录。
有3所学校和12个班级。
这两个查询中的哪一个会更快(如果存在差异)
查询1:
SELECT * FROM student WHERE school = 2 and class = 5;
查询2:
SELECT * FROM student WHERE class = 5 and school = 2;
注意:我刚刚更改了WHERE
中的2个条件的位置。
然后哪个更快,以下是真的吗?
- > query1中可能的记录数为333
- > query2中可能的记录数为80。
答案 0 :(得分:6)
一点点都没关系。 1000条记录是一个非常小的数据库表,如果存在差异,则需要从这样一个脑死亡的DBMS升级。
一个体面的DBMS已经从表中收集了统计数据(或者DBA会将其作为定期调整的一部分),而where
子句的顺序将无关紧要。
执行引擎会选择最快减少基数(即减少候选行组)的引擎。这意味着(假设课程和学校大致平均分配),class = 5
过滤器将首先发生,无论select
语句中的顺序如何。
更深入地解释基数问题,对于这1000个记录的大致均匀分布的传播,每个学校将有333个,每个班级有83个。
DBMS将会做的是先过滤最小的结果集。所以它倾向于使用类过滤器。这会立即将候选行列表丢弃到大约83.然后,抛出那些有2所以外的学校的简单问题。
在这两种情况下,您最终都会使用相同的最终行集,但初始过滤器通常更快,因为它可以使用索引来仅选择所需的行。另一方面,第二个过滤器很可能以较低效的方式遍历这些行,因此您可以越快地减少行数,就越好。
如果确实想知道,您需要衡量而不是猜测。这是DBA的主要职责之一,调整数据库以实现查询的最佳执行。
答案 1 :(得分:5)
这两个查询完全相同:)
答案 2 :(得分:2)
“您的数据库如何使用基数来优化您的查询”
所以,基本是真的,它们是相同的,但我会提到一个暗示“ why ”的想法,它实际上会引入一个好的RDBMS概念。
我们只是说假设您的RDBMS按照您指定的顺序使用WHERE子句严格。
在这种情况下,最佳查询将是首先指定最大基数的列。这意味着首先指定class=5
会更快,因为更快会消除考虑的行,这意味着如果行的“类”列不包含5(这在统计上更有可能比它的“学校”专栏不包含2),那么它甚至不需要评估“学校”专栏。
然而,回到现实,您应该知道几乎所有现代关系数据库管理系统都执行所谓的“构建查询计划”和“编译查询”。除其他外,这涉及评估WHERE子句中指定的列的基数(以及可用的索引等)。基本上,说它们相同可能是正确的,结果的数量也是如此。
答案 3 :(得分:1)
受影响的行数不会也可能不会因为您对sql语句的“where子句”中的条件重新排序而更改。 执行时间也不会受到影响,因为sql-server将首先查找匹配的索引。
答案 4 :(得分:-2)
第一个查询比第二个查询执行得更快,因为在where子句中它首先过滤学校,以便以后更容易获得课程详细信息