SQL是如何实现的;及;操作员工作,当两个字段都被索引时?

SQL是如何实现的;及;操作员工作,当两个字段都被索引时?,sql,Sql,考虑一下这个SQL 选择* 从某处 其中(纬度在10和20之间)和(经度在30和40之间) 现在,纬度和经度都被索引。SQL是如何在后台执行的 它会分别搜索满足每个条件的行,然后找到这些行的交集吗?比如 步骤1:查找满足条件1纬度在10和20之间的所有行 步骤2:找到所有满足条件2经度在30和40之间的行 步骤3:找到上述两组行之间的交点 如果这就是它的工作原理,它可能会非常慢,因为每个条件都会产生数百万行,这已经是非常内存密集的了。然后我们执行一个交叉口操作,这可能会很慢 有谁能解释一下

考虑一下这个SQL

选择*
从某处
其中(纬度在10和20之间)和(经度在30和40之间)
现在,
纬度
经度
都被索引。SQL是如何在后台执行的

它会分别搜索满足每个条件的行,然后找到这些行的交集吗?比如

  • 步骤1:查找满足条件1
    纬度在10和20之间的所有行
    
  • 步骤2:找到所有满足条件2
    经度在30和40之间的行
    
  • 步骤3:找到上述两组行之间的交点
如果这就是它的工作原理,它可能会非常慢,因为每个条件都会产生数百万行,这已经是非常内存密集的了。然后我们执行一个交叉口操作,这可能会很慢

有谁能解释一下,这就是SQL的工作原理,或者还有其他优化吗?

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

  • 初始相等条件,假设列(或表达式,如果支持基于表达式的索引)是索引中的初始键
  • 一个不平等
注意:有些数据库支持略增灵活性的跳过扫描操作,但我将忽略这一点

如果一个查询可以使用多个索引,那么优化器会选择哪一个索引最好

这些规则基本上告诉您,如果在
纬度
经度
上有两个单独的索引,那么优化器将选择其中一个

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


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

我删除了不一致的数据库标记。仅标记实际使用的数据库。如果是MySQL,则只在其中一列上使用索引;因为两者都是射程条件。索引将选择更具选择性的列。此外,SQL只是一种语言。每个关系数据库管理系统都有自己的算法、存储实现、不同的索引树结构等。因此,您的问题没有具体的答案。对于此查询,您最好在两列上创建一个复合索引,而不是在每列上创建一个索引。@这取决于很多因素:首先,数据库引擎、引擎版本、可用的数据运算符、列的选择性。如果您提供此信息,我们可以进一步帮助您。