拥有一个超过2000万行的MySQL表,Hibernate有一些方法可以建立一个标准,以获得给定纬度和经度的最近行吗?
使用Criteria
会很棒,因为我需要使用更多过滤器(价格,类别等)。
最后,它可以获得按距离排序的行吗?或者行太多了?
答案 0 :(得分:1)
计划A 有大量行,
性能方面,INDEX(lat)
不是首发,
即使限制条纹:
AND lat BETWEEN 65 AND 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。 这涉及一个重复探测的存储过程 表,寻找足够的行。 它还涉及PARTITIONing以获得粗略的2D索引。 该链接具有参考代码,其中包括对类别等内容进行过滤。
计划A和B是O(sqrt(N));计划C是O(1)。 也就是说,对于计划A和B,如果您将行数增加四倍, 你把时间加倍。计划C没有得到 增加N时速度会慢一些。