假设我有一个student表中包含id,class,school_id有1000条记录.
有3所学校和12个班级.
这两个查询中的哪一个会更快(如果存在差异)
查询1:
SELECT * FROM student WHERE school = 2 and class = 5;
Run Code Online (Sandbox Code Playgroud)
查询2:
SELECT * FROM student WHERE class = 5 and school = 2;
Run Code Online (Sandbox Code Playgroud)
注意:我刚刚更改了2个条件的位置WHERE.
然后哪个会更快,以下是真的吗?
- > query1中可能的记录数为333
- > query2中可能的记录数为80.
一点点都没关系.1000条记录是一个非常小的数据库表,如果存在差异,则需要从这样一个脑死亡的DBMS升级.
一个体面的DBMS已经从表中收集了统计数据(或者DBA将其作为定期调整的一部分完成),并且where条款的顺序将是无关紧要的.
执行引擎将选择最快地降低基数(即,减少候选行组)的那个.这意味着(假设课程和学校大致平均分配)class = 5过滤器将首先发生,无论select声明中的顺序如何.
更深入地解释基数问题,对于这1000个记录的大致均匀分布的传播,每个学校将有333个,每个班级有83个.
DBMS将做的是首先过滤给出最小结果集的内容.所以它倾向于使用类过滤器.那会立即将候选行列表丢弃到大约83.然后,这是一个简单的问题,抛出那些有2所以外的学校.
在这两种情况下,最终都会得到相同的最终行集,但初始过滤器通常更快,因为它可以使用索引来仅选择所需的行.另一方面,第二个过滤器很可能以较低效的方式遍历这些行,因此您可以越快地减少行数,就越好.
如果你真的想知道,你需要衡量而不是猜测.这是DBA的主要职责之一,调整数据库以实现查询的最佳执行.
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |