汇总列或新列

时间:2016-12-03 18:33:36

标签: mysql sql database sql-order-by

对于排名系统(在拥有数万用户的数据库中),我想按三列的总和对用户进行排名:例如Points_APoints_BPoints_C。我想知道什么是更好的选择:

  • 每次访问排名页面时,通过将所有列和顺序相加来计算用户的排名
  • 使用三列的总和创建一个新列Points_total(每次更新其他列之一时更新总计)并按此Points_total订购查询。

每秒可以多次请求排名页面,因此性能非常重要。第二种选择更快还是不推荐?

1 个答案:

答案 0 :(得分:0)

这是一个想法。而不是对排名的每个变化采取代价高昂的行动,看看这种复杂的方法是否会更好:

但首先,这取决于Points仅增加,而不是减少。它还假设您只需要前10名。并且不关心发现“我在10000中排名7654”)

设置触发器(或应用程序代码),只要等级增加就会作出反应。它将点数加在一起并检查阈值。如果低于排名第10的值,则不做任何进一步的操作。

如果更高,则执行SELECT ... ORDER BY ... LIMIT 10以获得新的“前10名”并将结果存储在单独的表中。另外,更新阈值。

可能的好处:

  • 这个单独的表是“每秒多次”访问的内容,但主表不必是。
  • 大部分时间(?)减少工作量。 (但是对那些得到很多改善的事情做更多的工作。)
  • 从主表(10K行)中分离排名显示表(10行),从而减少锁争用。
  • 可能是查询缓存的用例:
    • 打开它,
    • 设置query_cache_size = 20M(不太大),
    • query_cache_type = DEMAND
    • SQL_CACHE添加到排名SELECT;将SQL_NO_CACHE添加到大多数其他SELECTs

如果您需要的不仅仅是“前10名”中的一页,请考虑保存“前50名”。对于前5页,新表就足够了。对于第6页及更高版本,请以困难的方式进行(扫描10K行表)。希望这仍然很少,仍然是一个优势。