当两个字段都被索引时,SQL如何操作“和”运算符?

时间:2019-10-04 17:54:23

标签: sql

考虑此SQL

lists[graphOneDataIndex]

现在,SELECT * FROM places WHERE (latitude BETWEEN 10 AND 20) AND (longitude BETWEEN 30 AND 40) latitude已被两者索引。 SQL如何在后台执行?

是否会分别搜索满足每个条件的行,然后找到这些行的交叉点?如

  • 步骤1:找到满足条件1 longitude的所有行。
  • 步骤2:找到满足条件2 latitude BETWEEN 10 AND 20的所有行。
  • 第3步:找到上述两组行之间的交点。

如果这是它的工作方式,则可能会很慢,因为每个条件都可以产生数百万行,这已经非常占用内存。然后,我们执行交叉点操作,这可能会很慢。

谁能解释这是SQL的幕后工作方式,还是有其他优化方法?

1 个答案:

答案 0 :(得分:1)

大多数(如果不是全部)数据库中的默认索引是B树。对于where子句中的过滤器和索引查找(您真正想要的)可以与以下项一起使用:

  • 初始相等条件,假设列(或表达式,如果支持基于表达式的索引)是索引中的初始键。
  • 一个不平等。

注意:某些数据库支持跳过扫描操作,在这里稍微增加了灵活性,但是我将忽略它。

如果您有多个可用于查询的索引,则优化器将选择最佳索引。

这些规则基本上可以告诉您会发生什么情况。如果在latitudelongitude上有两个单独的索引,那么优化器将选择其中之一。

例如,如果您有一个带有(latitude, longitude)的复合索引,则只有第一个键用于定位索引中的行。可能会使用索引中的第二个键,但它不会影响索引中的行数。

所有这些都是为了说明标准索引在您的查询中无法正常工作。还有其他选择,特别是称为R树的结构。数据库将它们用于GIS /空间索引。如果您需要这种查询的性能,请使用空间索引。