【问题标题】:How to optimize a jpa query如何优化 jpa 查询
【发布时间】: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

标签: java mysql sql performance 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 ...

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2016-10-05
    • 2012-05-18
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多