gpt4 book ai didi

Mysql - 在多边形内管理和查找经纬度点的最佳方法

转载 作者:行者123 更新时间:2023-11-30 22:17:00 25 4
gpt4 key购买 nike

在 MySQL 中管理经纬度数据库的最佳方法是什么?我有一个非常大的数据库,其中包含很多餐厅的位置,我需要找到多边形(多边形尤其是矩形)内的餐厅是什么?

例如我有数据库:

第 1 行:纬度 (-6.8374651)经度 (107.56283)

第 2 行:纬度 (-6.947151)经度 (108.261528)

第 3 行:纬度 (-9.125182)经度 (115.121831)

等等

我有一个矩形,西北点:(-6.4516,107.19281) 和东南点:(-6.81726,106.19271)

我的问题是如何以最有效的方式找到该矩形内的餐厅列表?我有大约 5000 万行数据,并且每天都会增加

附言。我已经为纬度和经度创建了一个索引,并尝试像这样查询它:

SELECT * FROM location WHERE latitude<=-6.4516 AND latitude>=-6.81726 AND longitude<=107.19281 AND longitude>=106.19271

但是MySQL一直搜索到整个表,使得查询变得很慢

谢谢

最佳答案

MySQL 有 extensions for spatial data .

您可以将点和其他空间对象全部存储在一个列中(空间中的一个点毕竟是一个原子值,即使它看起来具有 X 和 Y 分量),然后添加一个 R-Tree数据索引——B-Tree 索引(例如您在数字数据类型列上找到的索引)不太适合空间查询,因为对于范围内的每个 X,都必须评估每个可能的 Y,即使是那些明显不相关的索引,因为 B-Tree 没有跨列的相关性——两个值被连接存储,如果您想要给定 X 的每个可能的 Y,这很好,但是当两个值描述空间中的一个点时就不合适了。

空间索引是二维的,基于最小边界矩形,因此感兴趣的“点”在物理上更靠近地存储在索引中。

在您有机会熟悉 MySQL 中的空间数据之前——这确实需要一点学习曲线——您可以通过为优化器提供两个选择来稍微优化现有结构:

ALTER TABLE location
ADD KEY longest (longitude,latitude),
ADD KEY latlong (latitude,longitude);

这有时会让优化器发现先搜索经纬度然后再扫描经纬度,或者先搜索经纬度再扫描经纬度,这样可以减少工作量,并且在每种情况下,它都应该比单独的索引执行得更好,如果是的话你现在拥有的。

此外,与所有查询一样,不要使用 SELECT *。只选择你真正需要的列,因为这通常会给优化器更多的选择来找到数据,同时做更少的工作。特别是在这里,在添加我建议的索引后,您可能会发现与选择所有列相比,仅选择(id、纬度、经度)比您预期的要快。

关于Mysql - 在多边形内管理和查找经纬度点的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com