我正在使用庞大的数据库并尝试进行顶级优化。
我想知道它是否会进行任何更改以索引在请求中用作条件的值,但是通过函数。
例如我有这个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
答案 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;