Java 按纬度和经度划分的休眠条件
有了一个超过2000万行的MySQL表,Hibernate可以通过某种方式构建一个标准,以便在给定纬度和经度的情况下获得最近的行吗 使用Java 按纬度和经度划分的休眠条件,java,mysql,hibernate,latitude-longitude,Java,Mysql,Hibernate,Latitude Longitude,有了一个超过2000万行的MySQL表,Hibernate可以通过某种方式构建一个标准,以便在给定纬度和经度的情况下获得最近的行吗 使用标准将非常好,因为我需要使用更多的过滤器(价格、类别等) 最后,可以按距离排序行吗?还是行太多?计划A有大量行, 索引(lat)是一种非启动型、性能型、, 即使限制为条纹: 和lat介于65和69之间。 索引(lat,lng)并不好,因为优化器会 不要同时使用两个列,即使和lng介于… 计划B您的下一个选择将涉及lat和lng,以及一个子查询。 而5.6版将是有
标准将非常好,因为我需要使用更多的过滤器(价格、类别等)
最后,可以按距离排序行吗?还是行太多?计划A有大量行,
索引(lat)
是一种非启动型、性能型、,
即使限制为条纹:
和lat介于65和69之间
。
索引(lat,lng)
并不好,因为优化器会
不要同时使用两个列,即使和lng介于…
计划B您的下一个选择将涉及lat和lng,以及一个子查询。
而5.6版将是有益的。有点像
这(包括索引(lat、lng、id)后)
:
由于种种原因,B计划只比A计划略好
计划C有数百万行,您需要
.
这涉及到一个重复探测的存储过程
检查表,查找足够的行。
它还涉及分区以获得粗略的2D索引。
该链接有参考代码,其中包括对类别等内容的过滤
方案A和方案B为O(sqrt(N));方案C为O(1)。
也就是说,对于方案A和B,如果将行数增加四倍,
你花了双倍的时间。C计划不可能成功
随着N的增加,速度变慢
SELECT ... FROM (
SELECT id FROM tbl
WHERE lat BETWEEN...
AND lng BETWEEN... ) x
JOIN tbl USING (id)
WHERE ...;