我正在尝试优化一条查询,该查询在一个表中计数近900,000行数据(不必要),这需要太长时间。
该表包含不同部分Web应用程序中发生的事件的日志条目,并且当该类型的行计数为1000或更少时,我想知道每个日志类型存在多少未读日志条目,但最多计算1001行,如果计数为1001或更多,则只需输出“超过1000”即可。
之后我不需要再计数了,我将只输出该日志类型的“超过1000”。
假设我们有以下名为my_logs
的表及其数据:
id log_type log_text is_read
1 'Type 1' 'Text 1' 1
2 'Type 1' 'Text 2' 1
3 'Type 1' 'Text 3' 0
4 'Type 1' 'Text 4' 0
5 'Type 1' 'Text 5' 0
6 'Type 1' 'Text 6' 0
7 'Type 2' 'Text 7' 0
8 'Type 2' 'Text 8' 0
在这个例子中,我的当前查询看起来像这样:
SELECT log_type, COUNT(*) AS unread FROM my_logs WHERE is_read = 0 GROUP BY log_type;
这个查询计算每一行,并且当然为每个日志类型提供了正确的行数。问题是,当表格包含900,000行时,这是一个昂贵的查询,而且计算每种类型超过1000行是完全不必要的,因为用户不会关心1000和20000之间的区别,他们只会看到很多条目。这是我接近解决方案的方式(限制调整以适应my_logs示例并演示用法):
SELECT log_type, COUNT(*) AS unread
FROM (
SELECT log_type
FROM my_logs ml1
WHERE is_read = 0
LIMIT 3 /* To display "more than 2" in webapp */
) AS ml2
GROUP BY logtype_txt;
但是这个查询将内部查询中的所有log_type汇总在一起,并将其限制为1001行,这不是我想要的。我需要将行拆分为每个log_type,然后计算最多1001行。在这个例子中,我想要的输出是:
log_type unread
'Type 1' 3
'Type 2' 2
这个问题和这个问题讨论了如何在找到n行时停止计数,但没有考虑到我需要的分组。
有人知道解决方案吗?