按纬度和经度的休眠条件

Hibernate criteria by latitude and longitude

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

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

最后,可以获取按距离排序的行吗?或者行数太多?

计划 A 行数较多, INDEX(lat) 是一个非首发,性能方面, 即使限制为条纹: AND lat BETWEEN 65 AND 69INDEX(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。 这涉及到一个存储过程来反复探测 table,寻找足够的行。 它还涉及分区以获得粗略的 2D 索引。 link 具有参考代码,其中包括过滤类别等内容。

计划A和B是O(sqrt(N));计划 C 是 O(1)。 也就是说,对于计划 A 和 B,如果将行数增加四倍, 你花费的时间加倍。 C计划没有得到 N 越大越慢。