我正在创建一个排行榜,并希望在客户端“接近”实时更新结果。
这是我的表格:
╔════╦═════════════════╦════════════╦════════╗
║ 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,只要它可以在客户端之后检索。
答案 0 :(得分:2)
此查询从主题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。
答案 1 :(得分:1)
很难给出一个通用的答案。
向SQL查询添加和索引以及limit
指令可能就足够了。
如果您需要可扩展的东西,可能解决方案是在不同的服务器上安装不同版本的数据库,每个主题一个。
下一步,如果你的数据库必须处理数十亿条记录,就是使用那种NoSQL系统,但我想你不需要走那么远。
答案 2 :(得分:1)
为什么不添加基于内存的存储空间,例如按主题索引的地图,该地图会显示n
顶级玩家的列表(按计数排序)?
如果内存不能包含所有数据,您也可以实现缓存解决方案。
此映射将在应用程序启动时填充,然后由应用程序的一个线程异步更新(因为您只需要接近实时)。
这样,从客户端的角度来看,对它的访问将是恒定的时间,并且不会针对您的应用程序的每次命中进行刷新,而是以指定的速率进行刷新。
希望它有所帮助,
祝你好运