如何优化 jpa 查询

Posted

技术标签:

【中文标题】如何优化 jpa 查询【英文标题】:How to optimize a jpa query 【发布时间】:2018-08-08 05:34:06 【问题描述】:

我有一个查询需要更多时间从 mysql 数据库中获取数据。数据库中只有很少的记录

@Query("    SELECT  COUNT(*)
    FROM  Message n
    WHERE  n.deleted = false
      AND  n.sent = true
      AND  n.senderEnvelope.user = ?1
      AND  n.replyToMessage IN (
        SELECT  DISTINCT m.replyToMessage
            FROM  Message m , Relationship r
            WHERE  m.deleted = false
              AND  m.sent = true
              AND  m.senderEnvelope.user = ?1
              AND  ?2 MEMBER OF r.categories 
                          )
       ")
Long countUniqueRepliesSentByUser(User currentUser ,
            RecommendationCategory recommendationCategory);

有没有一种方法可以优化此查询或以另一种方式纠正它。 请帮忙。提前致谢

【问题讨论】:

能不能在数据库中执行相应的SQL语句,看看执行得好不好,其次看看数据库的连通性好不好? 不,它也不能很好地在数据库上执行。是的,与数据库的连接很好。 您可以发布您的实体(消息和关系)吗? 因此,如果 SQL 查询(您尚未发布)执行“很糟糕”,那么您首先遵循有关如何优化 SQL 查询的常规规则,然后在您完成后返回 JPQL做到了!这里没有具体的 JPA 【参考方案1】:

最大的问题是没有为这两个表指定关系:

FROM  Message m , Relationship r

这会导致代价高昂的“交叉连接”。

这似乎是一个语法错误;它应该是什么意思??:

AND  ?2 MEMBER OF r.categories

修复这些之后,然后处理ININ ( SELECT DISTINCT ... ) 优化不佳。此外,DISTINCT 在某种程度上是多余的。考虑将其更改为

EXISTS ( SELECT 1 FROM ...
          AND n.replyToMessage = m.replyToMessage )

如有任何疑问,请提供EXPLAIN SELECT ...

【讨论】:

以上是关于如何优化 jpa 查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql+springboot+jpa查询几十万条数据很慢 如何解决?

[JavaEE - JPA] 性能优化: 如何定位性能问题

JPA,Hibernate,ibatis(mybatis)如何选用?

如何编写JPA查询

如何将地图作为 jpa 查询返回?

如何使用连接定义 JPA 存储库查询