因此,我在使用左连接来计算另一个表中的工单评论时遇到了严重的速度问题。我尝试在计数字段中使用子选择,并且具有完全相同的性能。
根据计数,查询大约 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
现在,并非所有票证都有评论,因此我不能只进行正确或标准连接。这样做时,速度相当不错(当前的 1/10),但不包括任何没有评论的票证。
我看到了三个解决方案,并且希望得到您的任何建议。
- 创建新列 comment_count 并对新评论使用触发器/更新查询
- 使用用户界面并即时获取评论(不是真正想要的)
- 希望 stackoverflow 的人们有一个更优雅的解决方案:þ
想法?
最佳答案
一位同事前来救援。该查询只是不正确地使用了连接。
这里必须做的是创建第二个表,其查询如下:
select count(*) from tickets_comment group by ticket_id where (clause matches other)
这将创建一个表,其中包含每个票证 ID 的计数。然后将该表与票证 ID 匹配的票证表连接起来。它不像创建新列那么快,但至少是原来速度的 1/10,所以我很高兴。
最后一步是将空值(没有评论的票证)转换为零
关于从第二个表开始计数时 MySQL 查询速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1841039/