按纬度和经度的休眠标准

ilo*_*una 6 java mysql hibernate latitude-longitude

有一个超过2000万行的MySQL表,Hibernate有一些方法可以建立一个标准,以获得给定纬度和经度的最近行?

使用Criteria会很棒,因为我需要使用更多的过滤器(价格,类别等).

最后,它可以获得按距离排序的行吗?还是行太多了?

Ric*_*mes 1

计划 A对于大量行, INDEX(lat)即使限制为条带,在性能方面也是行不通的 AND lat BETWEEN 65 AND 69INDEX(lat, lng)并没有更好,因为优化器不会使用这两列,即使AND lng BETWEEN...

计划 B您的下一个选择将涉及纬度和经度,以及子查询。5.6 版本会很有用。是这样的(包含之后INDEX(lat, lng, id)):

SELECT ... FROM (
    SELECT id FROM tbl
        WHERE lat BETWEEN... 
          AND lng BETWEEN... ) x
    JOIN tbl USING (id)
    WHERE ...;
Run Code Online (Sandbox Code Playgroud)

由于种种原因,B 方案仅比 A 方案稍好一些。

计划 C拥有数百万行,您将需要 我的披萨店算法。这涉及到一个存储过程来重复探测表,寻找足够的行。它还涉及分区以获得粗略的二维索引。该链接具有参考代码,其中包括对类别等内容进行过滤。

方案 A 和 B 均为 O(sqrt(N));计划 C 是 O(1)。也就是说,对于计划 A 和 B,如果将行数增加四倍,则花费的时间就会增加一倍。计划 C 不会随着 N 的增加而变慢。