对于排名系统(在拥有数万用户的数据库中),我想按三列的总和对用户进行排名:例如Points_A
,Points_B
和Points_C
。我想知道什么是更好的选择:
Points_total
(每次更新其他列之一时更新总计)并按此Points_total
订购查询。每秒可以多次请求排名页面,因此性能非常重要。第二种选择更快还是不推荐?
答案 0 :(得分:0)
这是一个想法。而不是对排名的每个变化采取代价高昂的行动,看看这种复杂的方法是否会更好:
但首先,这取决于Points
仅增加,而不是减少。它还假设您只需要前10名。并且不关心发现“我在10000中排名7654”)
设置触发器(或应用程序代码),只要等级增加就会作出反应。它将点数加在一起并检查阈值。如果低于排名第10的值,则不做任何进一步的操作。
如果更高,则执行SELECT ... ORDER BY ... LIMIT 10
以获得新的“前10名”并将结果存储在单独的表中。另外,更新阈值。
可能的好处:
query_cache_size = 20M
(不太大),query_cache_type = DEMAND
SQL_CACHE
添加到排名SELECT
;将SQL_NO_CACHE
添加到大多数其他SELECTs
。如果您需要的不仅仅是“前10名”中的一页,请考虑保存“前50名”。对于前5页,新表就足够了。对于第6页及更高版本,请以困难的方式进行(扫描10K行表)。希望这仍然很少,仍然是一个优势。