所以我在使用左连接来计算来自另一个表的票证评论时遇到严重的速度问题。我尝试在计数字段中使用子选择并且具有完全相同的性能。
通过计数,查询大约需要30秒才能获得1秒钟,而19000张门票则需要5秒(我有生产服务器和开发服务器,因此时间有点偏差)。我正在尝试对此进行优化,因为每次刷新页面时都需要运行四种查询变体。
如果没有计数,我会看到执行时间从1秒减少到0.03秒,所以当然所有票证都会运行,而不仅仅是所选票证。
以下是相关查询的精简版本:
SELECT tickets.ticket_id,
ticket_severity,
ticket_short_description,
ticket_full_description,
count(*) as commentCount,
FROM tickets (LEFT JOIN tickets_comment on ticket_id = tickets_comment.ticket_id)
WHERE ticket_status='Open'
and ticket_owner_id='133783475'
GROUP BY
everything,
under,
the,
sun
现在,并非所有门票都有评论,所以我不能只做正确或标准的加入。这样做的速度相当不错(当前的十分之一),但不包括任何没有评论的门票。
我看到了三个修正案,并希望得到任何建议。
想法?
答案 0 :(得分:1)
一位同事来救援。该查询只是使用了不正确的连接。
这里必须做的是创建第二个表,其中包含如下查询:
select count(*) from tickets_comment group by ticket_id where (clause matches other)
将创建一个包含每个故障单ID的计数的表。然后将该表与票证ID匹配的票证表连接。它并不像创建一个新列那么邪恶,但它的速度至少是它的十分之一,所以我很高兴这一点。
最后一步是将空值(在没有评论的故障单上)转换为零
答案 1 :(得分:0)
是迄今为止最快的解决方案,你会一直看到它在Rails中完成,因为它真的很快。
count(*)实际上仅在您未选择任何其他属性时使用。尝试count(ticket_id)并查看是否有帮助。我无法运行解释,所以我不能自己测试,但如果你的分析是正确的,它应该有帮助。
答案 2 :(得分:0)
尝试对查询运行说明以确保正在使用正确的索引。如果没有使用索引,请创建另一个