如何优化JPA查询

时间:2018-08-08 05:34:06

标签: java mysql sql performance jpa

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

@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);

有没有一种方法可以优化此查询或以其他方式对其进行纠正。 请帮忙。预先感谢

1 个答案:

答案 0 :(得分:0)

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

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 ...