【发布时间】:2015-02-19 22:58:20
【问题描述】:
我有一个 JPAQL-2-mySQL 查询在超时 5 分钟后停止运行:
select
question,
ans_items,
count(distinct ans_items.id) as voteCount,
(select
count(distinct ans.id)
from
answers ans
join ans.session ses
where
ses.survey.id = :surveyId
and ses.state = :sessionState
and ans.question.id = question.id
group by
question.id) as total,
max(ranks.rank) as rmax
from
Session as ss
join ss.answers as answers
join answers.items as ans_items
join answers.question as question
left join question.ranks as ranks
where
ss.survey.id = :surveyId
and ss.state = :sessionState
group by
question.id,
ans_items.variant.id,
ans_items.variantWeight
order by
question.orderNumber asc
如果我用常量值替换 COUNT:
select question, ans_items, 150,
(select 10 from answers ans join ans.session ses
where ses.survey.id=:surveyId and ses.state=:sessionState
and ans.question.id=question.id group by question.id) as total,
max(ranks.rank) as rmax
from Session as ss
join ss.answers as answers
join answers.items as ans_items
join answers.question as question
left join question.ranks as ranks
where ss.survey.id=:surveyId and ss.state=:sessionState
group by question.id, ans_items.variant.id, ans_items.variantWeight
order by question.orderNumber asc
,它会在 2 秒后开始执行。这快了 150 倍以上。似乎几个 COUNT 会大大降低查询速度!有没有办法优化查询,或者我绝对必须不使用数据库来计算计数(我可以这样做,但我想避免这种重写)。
【问题讨论】:
-
您查看过每个查询的 EXPLAIN 输出吗?
-
JOIN通常带有ON... -
@Brewal 是 JPAQL-to-mySQL,
ON是自动插入的……手动插入会影响性能吗? -
我的错……我不这么认为。我们能看到实际生成的 SQL 吗?
-
我猜,问题不是来自多个计数,而是来自列部分中的子选择。这会对每个结果行进行选择,这可能是降低查询速度的原因。您可以通过保留简单的
count(...) as voteCount并仅将子选择替换为常量值来验证这一点。
标签: mysql performance jpa