如果在函数中使用它们的值,我应该在列上创建索引吗? (SQLite的)

时间:2010-07-19 18:24:51

标签: optimization sqlite indexing

我正在使用庞大的数据库并尝试进行顶级优化。

我想知道它是否会进行任何更改以索引在请求中用作条件的值,但是通过函数。

例如我有这个GPS坐标表:

-Node (#id,lat,lng)

和此请求:

SELECT * FROM Node WHERE distance( lat, lng, $lat, $lng ) < $threshold

在lat和lng上创建索引会进行任何优化吗? (我正在使用SQLite)

由于

编辑我只是想到了同样的问题,但如果我直接计算:

SELECT * FROM Node WHERE (lat-$lat)*(lat-$lat) + (lng-$lng)*(lng-$lng)  < $threshold

2 个答案:

答案 0 :(得分:2)

对于查询,您绝对会看到性能优势。

但是对于jumbo数据库,您还会遇到插入性能损失。

答案 1 :(得分:1)

数据库需要计算示例中每个节点的距离,并且不会从索引中受益。然而,如果你索引lng和lat列并使用它们首先消除所有具有abs(lat - $ lat)&gt;的节点。 $ threshold或abs(lng - $ lng)&gt; $ threshold你可以看到性能提升,因为在计算剩余记录的距离之前,数据库可以使用创建的索引来消除大量记录。

查询看起来像这样:

SELECT * FROM Node 
WHERE lat >= $lat - $threshold
AND lat <= $lat + $threshold
AND lng >= $lng - $threshold
AND lng <= $lng + $threshold
AND distance( lat, lng, $lat, $lng )  < $threshold;
相关问题