在SQL中快速搜索最近的值

时间:2012-12-31 08:31:10

标签: mysql sql performance sqlite

我在SQLite数据库中有高度的长/纬坐标。

一些示例数据:

latitude   longitude  altitude
------------------------------
48.003333  11.0       652    
48.036667  11.000833  651
48.280833  11.000833  533

现在我想要一些SQL查询,它会给出最接近给定纬度/经度坐标的高度,例如

鉴于纬度/经度将 48.023445 / 11.000733 ,因此最接近海拔651 ,纬度/经度 48.036667 / 11.000833 。试图搜索很多论坛,但没有任何用处。无处不在是一个变量或非常慢的查询的例子。我非常快速地需要这个查询,并且看到了一些基于UNIONS的解决方案。我需要它很快,因为我将在这张桌子上进行大约1,5百万的查询。我正在使用交易和索引。

3 个答案:

答案 0 :(得分:4)

出于您的目的(靠近搜索坐标的点),您最好尽量减少使用飞机上距离的公式。

(lat-latitude)*(lat-latitude) + (long-longitude)*(long-longitude)

答案 1 :(得分:3)

使用经度和纬度坐标计算球体上两点之间距离的公式远非简单,is described here。如页面中所指定的,如果点数相当接近,您可以使用简单的平面三角法,并使用点之间的欧几里德距离:

答案 2 :(得分:1)

我会使用以下类似的查询:

select * from pos order by ((lat-48.00333)*(lat-48.00333)+(long-11.0)*(long-11.0)+(alt-652)*(alt-652));

SQLite不支持SQRT,但由于SQRT是单调的,您可以在距离公式中跳过它。