ilo*_*una 6 java mysql hibernate latitude-longitude
有一个超过2000万行的MySQL表,Hibernate有一些方法可以建立一个标准,以获得给定纬度和经度的最近行?
使用Criteria
会很棒,因为我需要使用更多的过滤器(价格,类别等).
最后,它可以获得按距离排序的行吗?还是行太多了?
计划 A对于大量行,
INDEX(lat)
即使限制为条带,在性能方面也是行不通的
AND lat BETWEEN 65 AND 69
:
INDEX(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 的增加而变慢。
归档时间: |
|
查看次数: |
762 次 |
最近记录: |