MySQL按热度排名前10位,而不对整个数据集进行排序

时间:2018-09-30 02:52:41

标签: mysql

背景

我的表discussion由数十亿行组成,其中包含数百万个不同的topic

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | No   | PRI | NULL    |       |
| topic   | varchar(32) | YES  | MUL | NULL    |       |
| content | longtext    | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

问题

我想要排名前10位的主题(按提及时间排序),并且花费几分钟时间对按主题分组的整个数据集进行排序(有数百万个不同的主题)。

现有的SQL:

select (select uuid()) id, topic, count(*) heat
from discussion
group by topic order by heat desc limit 0, 10

问题

MySQL中是否有一种方法可以在不对整个数据集进行排序的情况下获得前10名(例如选择排序或堆排序)。

还是有其他方法可以在几秒钟内完成?

1 个答案:

答案 0 :(得分:1)

好吧,如果您想要 top 10,MySQL将必须首先对整个数据集进行排序。
没有其他方法。

使用柱状存储,或者如果用例允许,使用排序集(Google:redis排行榜,这是经典用例)的Redis缓存,您将获得更好的性能。