1

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

这是我的桌子的样子:

╔════╦═════════════════╦════════════╦════════╗
║ 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,只要它可以在客户端之后检索。

4

3 回答 3

2

此查询从 topic 获取前 2 个结果,从 topic 获取wtf前 3 个结果nowplaying

(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)

这是小提琴链接

于 2013-01-31T13:55:49.177 回答
1

很难给出一个千篇一律的答案。

向您的 SQL 查询添加和索引以及一条limit指令可能就足够了。

如果您需要更大的扩展性,也许解决方案是在不同的服务器上拥有不同版本的数据库,每个主题一个。

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

于 2013-01-31T14:00:55.180 回答
1

为什么不添加基于内存的存储,例如按主题索引的地图,它会提供您的n顶级玩家列表(按计数排序)?

如果内存不能包含所有数据,您还可以实施缓存解决方案。

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

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

希望能帮助到你,

最好的祝福

于 2013-01-31T14:07:35.237 回答