哪个sql会更快,为什么?

时间:2012-08-28 06:51:07

标签: mysql sql

假设我的student表包含idclassschool_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。

5 个答案:

答案 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子句中它首先过滤学校,以便以后更容易获得课程详细信息