2015-05-12 24 views
6

拥有一个拥有超过2000万行的MySQL表格,Hibernate有一些方法可以构建一个标准,以获得给定经度和纬度的最近行数?按经度和纬度划分的休眠标准

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

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

回答

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 ...; 

由于种种原因,B计划只比A计划稍好

C计划随着数百万行的,你需要 my pizza parlor algorithm 。 这涉及一个存储过程重复探测 表,寻找足够的行。它还涉及PARTITIONing以获得粗略的2D索引。 该链接具有参考代码,包括对类别等内容进行过滤。

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