Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在没有对整个数据集进行排序的情况下,按热度排名前10名 背景_Mysql - Fatal编程技术网

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