问题
随着地理位置的应用普及,越来越多类似计算 一个点 附近的酒店的需求。比如,显示当前位置2000米范围内的 7 天酒店。
一般来说,在系统里都有一张表,存储了每个 7 天酒店的位置信息,表结构可以简化为三个字段 tb_location(ID, lng, lat)
,其中 lng:表示经度;lat:表示纬度,这两个字段都是数值类型的,且建了索引。
现在要把 2 公里范围内的 7 天酒店找出来,有的人写的 SQL 语句大概是这样的:
select id from tb_location where calc_distance(lng, lat, curLng, curLat) < 2000
这个语句的问题是没法利用索引,需要全表扫描,计算每一条记录与当前位置的距离,效率很低。
优化
用一张图来说明优化策略: