如何优化 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
修复这些之后,然后处理IN
。 IN ( SELECT DISTINCT ... )
优化不佳。此外,DISTINCT
在某种程度上是多余的。考虑将其更改为
EXISTS ( SELECT 1 FROM ...
AND n.replyToMessage = m.replyToMessage )
如有任何疑问,请提供EXPLAIN SELECT ...
。
【讨论】:
以上是关于如何优化 jpa 查询的主要内容,如果未能解决你的问题,请参考以下文章
mysql+springboot+jpa查询几十万条数据很慢 如何解决?