MySQL在没有对整个数据集进行排序的情况下,按热度排名前10名 背景
我的表格MySQL在没有对整个数据集进行排序的情况下,按热度排名前10名 背景,mysql,Mysql,我的表格discussion由数十亿行和数百万个不同的主题组成s: +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | No | PRI | NULL
discussion
由数十亿行和数百万个不同的主题组成
s:
+---------+-------------+------+-----+---------+-------+
| 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名
或者有没有其他方法可以在几秒钟内完成这项工作?好吧,如果你想要排名前10名,MySQL将首先对整个数据集进行排序。
没有其他方法。
使用列式存储,或者如果您的用例允许,使用排序集(google:Redis leaderboard,这是一个经典用例)的Redis缓存,您会获得更好的性能。此表有任何索引吗?有一个
主题
索引将数百万数据从MySQL传输到Redis会花费很多吗?我认为很难在Redis中保存数据,因为我要排序的列heat
是虚拟的。我错过了什么吗?使用缓存是一个很好的方法,但是有没有办法让这个操作及时进行?@kasheemlew你说的及时是什么意思?每当您写入MySQL时,您也会写入Redis:ZINCRBY topics\u to\u msgcount 1“mytopic”
(对于名为topics\u to\u msgcount的排序集,增量“mytopic”[也可以是ID])。要获得排序结果,请使用Cores
将ZREVRANGE主题计数为0-1。要删除除前十名以外的任何结果:ZREMRANGEBYRANK topics\u To\u msgcount 0-11