按纬度和经度的休眠条件
Hibernate criteria by latitude and longitude
MySQL table 有超过 2000 万行,Hibernate 有一些方法可以建立一个标准,以便在给定纬度和经度的情况下获得最近的行?
使用 Criteria
会很棒,因为我需要使用更多过滤器(价格、类别等)。
最后,可以获取按距离排序的行吗?或者行数太多?
计划 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。
这涉及到一个存储过程来反复探测
table,寻找足够的行。
它还涉及分区以获得粗略的 2D 索引。
link 具有参考代码,其中包括过滤类别等内容。
计划A和B是O(sqrt(N));计划 C 是 O(1)。
也就是说,对于计划 A 和 B,如果将行数增加四倍,
你花费的时间加倍。 C计划没有得到
N 越大越慢。
MySQL table 有超过 2000 万行,Hibernate 有一些方法可以建立一个标准,以便在给定纬度和经度的情况下获得最近的行?
使用 Criteria
会很棒,因为我需要使用更多过滤器(价格、类别等)。
最后,可以获取按距离排序的行吗?或者行数太多?
计划 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。 这涉及到一个存储过程来反复探测 table,寻找足够的行。 它还涉及分区以获得粗略的 2D 索引。 link 具有参考代码,其中包括过滤类别等内容。
计划A和B是O(sqrt(N));计划 C 是 O(1)。 也就是说,对于计划 A 和 B,如果将行数增加四倍, 你花费的时间加倍。 C计划没有得到 N 越大越慢。