按纬度和经度的休眠标准

时间:2015-05-12 14:47:06

标签: java mysql hibernate latitude-longitude

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

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

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

1 个答案:

答案 0 :(得分:1)

计划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。 这涉及一个重复探测的存储过程 表,寻找足够的行。 它还涉及PARTITIONing以获得粗略的2D索引。 该链接具有参考代码,其中包括对类别等内容进行过滤。

计划A和B是O(sqrt(N));计划C是O(1)。 也就是说,对于计划A和B,如果您将行数增加四倍, 你把时间加倍。计划C没有得到 增加N时速度会慢一些。