定期为列查找n个值最高的行

2024-09-28 23:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个排行榜,并希望结果被更新在“近”实时客户端。你知道吗

我的桌子是这样的:

╔════╦═════════════════╦════════════╦════════╗
║ id ║ author          ║topic       ║  count ║
╠════╬═════════════════╬════════════╬════════╣
║  1 ║ jazzgarza       ║ nowplaying ║      1 ║
║  2 ║ DJBure          ║ nowplaying ║     16 ║
║  3 ║ GRC__romoly     ║ nowplaying ║      5 ║
║  4 ║ MarineBerteloot ║ wtf        ║      1 ║
║  5 ║ Nick_Lukitsh    ║ nowplaying ║      1 ║
║  6 ║ Mugen__         ║ nowplaying ║      2 ║
║  7 ║ MaxChebotarev   ║ nowplaying ║      6 ║
║  8 ║ radeonvelcro    ║ nowplaying ║      9 ║
║  9 ║ SF1033          ║ nowplaying ║    102 ║
╚════╩═════════════════╩════════════╩════════╝

我基本上希望能够检索给定主题中计数最高的n行。 我想对每个主题都这样做,n可能会根据主题而变化。你知道吗

目前,我有一个简单的哑SQL查询,我定期运行(每秒钟左右,针对每个主题)。你知道吗

SELECT * FROM member WHERE member.topic = 'wtf' ORDER BY member.count DESC

但是我的表增长非常快(大约每秒增加7个用户),而且我的解决方案绝对不能正确地扩展。 我尝试添加一个索引,但这可能只是一个快速修复,不会永远奏效。n可能在3到50之间,我希望能够同时跟踪几百个主题。你知道吗

所以我的问题是,有什么更聪明的方法可以做到这一点?你知道吗

我对任何事情都很开放。我的解决方案不一定是纯SQL,只要它可以在客户端之后检索。你知道吗


Tags: id客户端主题sqltopiccount解决方案author
3条回答

为什么不添加一个基于内存的存储,比如一个按主题索引的地图,它给出了n顶级玩家的列表(按计数排序)?你知道吗

如果内存不能包含所有的数据,也可以实现缓存解决方案。你知道吗

这个映射将在应用程序启动时填充,然后由应用程序的一个线程异步更新(因为您只需要接近实时)。你知道吗

这样,从客户机的角度来看,对它的访问将是在固定时间内进行的,并且刷新不会针对应用程序的每次命中进行,而是以指定的速率进行。你知道吗

希望有帮助

致以最诚挚的问候

很难给出一刀切的答案。你知道吗

向SQL查询中添加和索引以及limit指令就足够了。你知道吗

如果您需要更大的可扩展性,那么解决方案可能是在不同的服务器上拥有不同版本的DB,每个主题一个。你知道吗

下一步,如果您的数据库必须处理数十亿条记录,则使用这种NoSQL系统,但我想您不需要走那么远。你知道吗

此查询从主题wtf获取前2个结果,并从主题nowplaying获取前3个结果:

(SELECT * FROM member WHERE topic = 'wtf' ORDER BY count DESC LIMIT 3) UNION (SELECT * FROM member WHERE topic = 'nowplaying' ORDER BY count DESC LIMIT 3)

这是fiddle link。你知道吗

相关问题 更多 >