有一个包含超过 2000 万行的 MySQL 表,Hibernate 是否有某种方法可以建立一个标准,以便在给定经纬度的情况下获得最近的行?
使用 Criteria
会很棒,因为我需要使用更多过滤器(价格、类别等)。
最后,是否可以让行按距离排序?还是行数太多?
最佳答案
计划 A 有大量的行,
INDEX(lat)
是一个非启动器,在性能方面,
即使限制为条纹:
纬度在 65 和 69 之间
。
INDEX(lat, lng)
并没有更好,因为优化器会
不要同时使用两列,即使使用 AND lng BETWEEN...
B 计划 您的下一个选择将涉及 lat 和 lng,以及一个子查询。
5.6 版将是有益的。有点像
这(包括 INDEX(lat, lng, id)
之后):
SELECT ... FROM (
SELECT id FROM tbl
WHERE lat BETWEEN...
AND lng BETWEEN... ) x
JOIN tbl USING (id)
WHERE ...;
由于各种原因,B 方案仅比 A 方案略好。
C 计划 如果有数百万行,您将需要 my pizza parlor algorithm . 这涉及到一个存储过程来反复探测 表,寻找足够的行。 它还涉及分区以获得粗略的 2D 索引。 该链接包含引用代码,其中包括对类别等内容的过滤。
计划A和B是O(sqrt(N));计划 C 是 O(1)。 也就是说,对于计划 A 和 B,如果将行数增加四倍, 你花费的时间加倍。 C计划没有得到 N 越大越慢。
关于java - 按纬度和经度的 hibernate 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194324/