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

Optimization 如果列的值在函数中使用,我是否应该在列上创建索引?(SQLite),optimization,sqlite,indexing,Optimization,Sqlite,Indexing,我正在处理一个巨大的数据库,并试图对其进行优化 我想知道它是否会通过函数对请求中用作标准的值进行索引更改 例如,我有一个GPS坐标表: -Node (#id,lat,lng) 这项请求: SELECT * FROM Node WHERE distance( lat, lng, $lat, $lng ) < $threshold 从节点中选择*距离(纬度、液化天然气、$纬度、$液化天然气)$threshold的节点,则会看到性能的提高,因为数据库可以使用创建的索引在计算剩余记录的距离之前

我正在处理一个巨大的数据库,并试图对其进行优化

我想知道它是否会通过函数对请求中用作标准的值进行索引更改

例如,我有一个GPS坐标表:

-Node (#id,lat,lng)
这项请求:

SELECT * FROM Node WHERE distance( lat, lng, $lat, $lng ) < $threshold
从节点中选择*距离(纬度、液化天然气、$纬度、$液化天然气)<$threshold
在lat和lng上创建一个指数会带来任何优化吗?(我正在与SQLite合作)

谢谢

编辑我刚刚考虑了同一个问题,但如果我直接进行如下计算:

SELECT * FROM Node WHERE (lat-$lat)*(lat-$lat) + (lng-$lng)*(lng-$lng)  < $threshold
从节点中选择*,其中(lat-$lat)*(lat-$lat)+(lng-$lng)*(lng-$lng)<$threshold

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


但是使用jumbo数据库时,插入也会对性能造成影响。

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


但是使用jumbo数据库时,在插入时也会遇到性能问题。

数据库需要计算示例中每个节点的距离,而不会从索引中受益。但是,如果为lng和lat列编制索引,并使用它们首先删除所有具有abs(lat-$lat)>$threshold或abs(lng-$lng)>$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;
从节点中选择*
其中lat>=$lat-$threshold
lat=液化天然气-$阈值

在您的示例中,数据库将需要计算每个节点的距离,而不会从索引中受益。但是,如果为lng和lat列编制索引,并使用它们首先删除所有具有abs(lat-$lat)>$threshold或abs(lng-$lng)>$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;
从节点中选择*
其中lat>=$lat-$threshold
lat=液化天然气-$阈值

在这种情况下,我不相信distance()是聚合函数,除非它使用所有行的数据来计算距离;它看起来像是计算两个纬度/经度点之间的笛卡尔距离,并根据函数本身的输入值返回单个值,而不是从表resultset返回,使其成为标量函数。是的,实际上它是标量函数。谢谢。我不相信distance()在这种情况下是聚合函数,除非它使用所有行的数据来计算距离;它看起来像是计算两个纬度/经度点之间的笛卡尔距离,并根据函数本身的输入值返回单个值,而不是从表resultset返回,使其成为标量函数。是的,实际上它是标量函数。谢谢。实际上我不知道该怎么做,因为索引只是对值(本例中是lat和lng)进行排序,对吗?SQLite引擎不知道函数(距离)是否是单调的,甚至不是线性的。那么它怎么知道它只需要计算一部分值呢?@julien-我可能错了,因为我绝不是sqlite专家,但是db引擎仍然需要找到要提供给函数的行,不是吗?在一个大型数据库中,一个索引可能会产生很大的不同,我怀疑。实际上我不知道如何,因为索引只是对值(本例中是lat和lng)进行排序,对吗?SQLite引擎不知道函数(距离)是否是单调的,甚至不是线性的。那么它怎么知道它只需要计算一部分值呢?@julien-我可能错了,因为我绝不是sqlite专家,但是db引擎仍然需要找到要提供给函数的行,不是吗?在一个大型数据库中,一个索引可能会产生很大的不同。