众所周知,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< = height< = Y和A< = age< = B
是不是会这样,首先在整个记录中搜索给定范围内的高度,然后同样的事情将在年龄上完成。 ???
答案 0 :(得分:1)
查询计划程序将尝试查找搜索表并测试WHERE
子句的最佳方法。它将首先尝试使用索引,这将缩小它需要搜索的行。如果有多个潜在的索引,它会尝试使用它估计的那个最好的缩小索引。
然后它将扫描所有这些行,并针对所有剩余条件测试每个行。它永远不需要在整个表格上进行多次传递。
如果要查看特定查询的执行方式,请使用EXPLAIN
命令。
答案 1 :(得分:1)
数据库服务器有多个选项来解决该查询。它将选择服务器"认为"更快。
我看到的选项是:
where
条款的行height
列的索引上搜索height
范围,然后使用age between A and B
谓词过滤掉行。age
列的索引上搜索age
范围,然后使用height between X and Y
谓词过滤掉行数据库服务器并不总是使用可能适用的索引,它在使用之前会考虑一些事情,例如:
更有可能使用高选择性指数。 可能会使用覆盖索引。