在where

时间:2016-02-04 10:39:06

标签: mysql sql-server

众所周知,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

是不是会这样,首先在整个记录中搜索给定范围内的高度,然后同样的事情将在年龄上完成。 ???

2 个答案:

答案 0 :(得分:1)

查询计划程序将尝试查找搜索表并测试WHERE子句的最佳方法。它将首先尝试使用索引,这将缩小它需要搜索的行。如果有多个潜在的索引,它会尝试使用它估计的那个最好的缩小索引。

然后它将扫描所有这些行,并针对所有剩余条件测试每个行。它永远不需要在整个表格上进行多次传递。

如果要查看特定查询的执行方式,请使用EXPLAIN命令。

答案 1 :(得分:1)

数据库服务器有多个选项来解决该查询。它将选择服务器"认为"更快。

我看到的选项是:

  • 扫描整个表并过滤掉不符合where条款的行
  • height列的索引上搜索height范围,然后使用age between A and B谓词过滤掉行。
  • age列的索引上搜索age范围,然后使用height between X and Y谓词过滤掉行
  • 寻找两个索引,然后执行索引交集

数据库服务器并不总是使用可能适用的索引,它在使用之前会考虑一些事情,例如:

  • 索引选择性。
  • 索引覆盖率。

更有可能使用高选择性指数。 可能会使用覆盖索引。