用于查询两列值范围的多列索引

时间:2018-01-22 03:01:05

标签: sqlite

我的SQLite数据库将位置数据存储为latitudelongitude值。我将经常使用以下查询来查询数据库:

SELECT * FROM locations WHERE latitude > 22.2 && latitude < 22.3 && longitude > 50.7 && longitude < 50.8

latitude上的多列索引以及longitude是否有助于加快查询速度? This answer提供了使用多列索引执行查询的方式,但随附的注释提到它在SQLite中不起作用。

2 个答案:

答案 0 :(得分:0)

基于this SO answer只需在纬度列上添加索引就可以以有意义的方式帮助查询。假设您可以提供足够窄的纬度范围,SQLite只需要按经度扫描相对较少数量的记录。

答案 1 :(得分:0)

咨询docs。我相信多列索引仍然有用。

  

使用的最右列可能会使用不等式。

假设您的索引已打开(lat,long)。然后lat将被“使用”而long将不会被“使用”。这完全取决于“使用”的含义。

我的猜测是“使用”索引意味着应用受益于索引排序顺序的访问策略。这样的策略是通过依赖于订单的搜索来寻找第一个匹配的行,并连续读取到最后一个匹配的行。

我强烈怀疑,在使用lat之后,将扫描索引中的行并比较它们的长值。通过在索引中进行过滤,将避免代价高昂的表查找。只有匹配的行才会有表查找。

如果索引仅为(lat),则每个符合条件的lat行都将进行表查找。

与查询优化一样,检查执行计划并测量IO。