众所周知,sql 查询的 where 子句在 select 子句之前执行。我们在 where 子句中放置了一些条件,以根据我们的要求过滤掉结果。
在编写一些查询时,我在脑海中遇到了一个问题,即在 where 子句中使用多个条件以及应用它们以何种顺序从所选表中过滤结果是否有任何缺点。
例如:我们有一个表格
Building(name,height,owner,builder_name,age)
我们有一个查询:
select * from Building
where height between X and Y and age between A and B
现在,此查询将如何执行。那么条件的顺序呢,即
X<=身高<=Y 和 A<=年龄<=B
会不会像这样,首先将搜索整个记录在给定范围内的高度,然后对年龄做同样的事情。 ???
有多个选项来解决该查询。它将选择服务器"认为"更快的选项。
我看到的选项是:
- 扫描整个表并筛选出不满足
where
子句的行
在 - 列
height
索引上查找height
范围,然后使用谓词筛选出age between A and B
行。
在 - 列
age
索引上查找age
范围,然后使用谓词筛选出height between X and Y
行 - 查找两个索引,然后执行索引交集
数据库服务器并不总是使用可能适用的索引,它会在使用索引之前考虑一些事项,例如:
- 索引选择性。
- 指数覆盖率。
更有可能使用高选择性指标。可能会使用覆盖索引。
查询计划程序将尝试找到搜索表和测试 WHERE
子句的最佳方法。如果可能,它将首先尝试使用索引,这将缩小需要搜索的行的范围。如果有多个潜在索引,它将尝试使用它估计最能缩小范围的一个。
然后,它将扫描所有这些行,并根据所有剩余条件测试它们中的每一行。它永远不需要对整个表进行多次传递。
如果要查看特定查询的执行方式,请使用 EXPLAIN
命令。