我的表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名(例如选择排序或堆排序)。
还是有其他方法可以在几秒钟内完成?
答案 0 :(得分:1)
好吧,如果您想要 top 10,MySQL将必须首先对整个数据集进行排序。
没有其他方法。
使用柱状存储,或者如果用例允许,使用排序集(Google:redis排行榜,这是经典用例)的Redis缓存,您将获得更好的性能。