java - 按纬度和经度的 hibernate 条件

标签 java mysql hibernate latitude-longitude

有一个包含超过 2000 万行的 MySQL 表,Hibernate 是否有某种方法可以建立一个标准,以便在给定经纬度的情况下获得最近的行?

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

最后,是否可以让行按距离排序?还是行数太多?

最佳答案

计划 A 有大量的行, INDEX(lat) 是一个非启动器,在性能方面, 即使限制为条纹: 纬度在 65 和 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 . 这涉及到一个存储过程来反复探测 表,寻找足够的行。 它还涉及分区以获得粗略的 2D 索引。 该链接包含引用代码,其中包括对类别等内容的过滤。

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

关于java - 按纬度和经度的 hibernate 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194324/

相关文章:

java - WSO2 JAVA 8 准备好了吗?

java - 使用 eclipse 和我的 "module-info.java"生成 javadoc 时出错

mysql left join返回意外数量的行

java - 传递的分离实体在 Spring-Data 中持久存在

hibernate - 从gradle调用hbm2ddl

java - 我们如何在 CrudRepository 中实现自定义查找方法以仅从数据库中获取特定列?

java - 我怎样才能让我的 do while 循环按照我想要的方式工作?

java - 反转所有单词,设置 "."并对接下来的句子执行相同的操作

Select 中的 MYSQL 更新 - 在连接行时多次更新行

MySQL嵌套连接