Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在每个列都必须支持排序的排行榜表格中存储数据的最佳方式是什么?_Mysql_Sql_Database_Leaderboard - Fatal编程技术网

Mysql 在每个列都必须支持排序的排行榜表格中存储数据的最佳方式是什么?

Mysql 在每个列都必须支持排序的排行榜表格中存储数据的最佳方式是什么?,mysql,sql,database,leaderboard,Mysql,Sql,Database,Leaderboard,我目前正在使用一个外部API重新构建一个游戏排行榜,游戏中的每个统计数据都可以被视为一个单独的排行榜。有超过150个统计数据,只有少数玩家拥有全部数据,大多数玩家可能拥有50-100个数据。这些数据包括不同的武器使用情况、游戏时间、死亡人数等 目前的live版本使用了一种我不喜欢的方法,但我想不出更好的解决方案。由于需要为每个统计数据提供排序依据,我有一个包含150多列的大型表,每列都是统计数据之一,该表现在大约有20万行。被索引的列工作正常,但我的索引用完了,因为MySQL总共只允许64个,而

我目前正在使用一个外部API重新构建一个游戏排行榜,游戏中的每个统计数据都可以被视为一个单独的排行榜。有超过150个统计数据,只有少数玩家拥有全部数据,大多数玩家可能拥有50-100个数据。这些数据包括不同的武器使用情况、游戏时间、死亡人数等

目前的live版本使用了一种我不喜欢的方法,但我想不出更好的解决方案。由于需要为每个统计数据提供排序依据,我有一个包含150多列的大型表,每列都是统计数据之一,该表现在大约有20万行。被索引的列工作正常,但我的索引用完了,因为MySQL总共只允许64个,而没有被索引的列加载速度非常慢,即使在我查看数据的前50行时也是如此

我曾考虑过按类别划分统计数据,并拥有6个左右的表格,其中列数较少,但这意味着如果有人想同时查看武器x(武器类别)和游戏(主要统计类别),我必须将表格合并在一起

除了支持每个统计数据的排行榜外,还需要支持按比率创建的排行榜,最常见的是死亡/死亡、死亡/游戏、胜利/游戏。在我的实时版本中,这是受支持的,但速度非常慢,当我试图查看每场游戏(武器x/玩过的游戏)的武器x杀戮排行榜时,加载前50个结果需要几秒钟,而这两列都在同一个表中

当玩家属性被添加时,包含它们的统计数据的旧行被标记为历史数据,因此排行榜查询可以只考虑实时数据,这确实提高了我的表现,因为我不必使用<代码> max(列)< /C>来找到玩家的正确值。但我确实希望以某种方式将这些历史数据保存在表格中,以便人们可以查看历史排行榜

除了每个属性都有一列的表外,我还想到了一个表,一列名为
stat\u id
,一列名为
count
,但当我尝试实现它时,我意识到如果平均每个玩家有50个属性,并且已经有20多万行,然后,新表将有超过一百万行,这将需要在每个查询上进行连接,以找出stat_id是什么

我可能已经回答了我自己的问题,每个统计数据都有一列的表确实是最好的选择,但我也认为,一定有一些我没有意识到的东西或其他方法可能会提高性能,特别是在处理为玩家计算排行榜位置的问题时,目前需要50秒——每列2分钟

这是“实时排行榜”(不包括历史数据)的当前排行榜查询,其中
$columnsToSelect
是列名的字符串列表,有时是列的比率,
$This->params
是用户可用于自定义结果集的参数对象。少于50场比赛的玩家不会存储在排行榜表中,查询也会按Id排序,这样就可以找到玩家的确切位置,并可以找到他们所在的页面

$sql = "SELECT s.`id`, `player`, $columnsToSelect, `lastupdated`;
        FROM stats_table as s
        WHERE $orderColumn <> 0
        AND `historical` = 0
        AND `banned` = 0 " . (
            $this->params["mingames"] > 50 ? (
                "AND `gamesplayed` >= " . $this->params["mingames"] 
            ) : ""
        );

$sql .= " AND ($orderColumn, s.id) <= (?, ?)
              ORDER BY $orderColumn DESC, s.`id` DESC
              LIMIT " . $this->params["rows"];
$sql=“选择s.`id`、`player`、$columnsToSelect、`lastupdated`”;
从stats_表作为s
其中$orderColumn 0
和`历史`=0
和“禁止”=0。(
$this->params[“mingames”]>50(
“和`gamesplayed`>=”$this->params[“mingames”]
) : ""
);

$sql.=”和($orderColumn,s.id)MySQL并不是对每一列进行排序的最佳数据库解决方案

你有没有看过MariaDB的专栏店


如果你做不到这一点,另一个解决方案是限制足够的结果,以便将排序(在MySQL之外)推送到客户端应用程序。

MySQL不是对每一列进行排序的最佳数据库解决方案

你有没有看过MariaDB的专栏店


如果您不能做到这一点,另一个解决方案是限制结果,使其足以将排序(在MySQL之外)推送到客户端应用程序。

您可以显示您当前的查询(我假设限制用于获取前X个前导)我不懂
和($orderColumn,s.id)@草莓AND子句是一个seek谓词,可以避免使用LIMIT和OFFSET。禁用列应该在players表中,但我认为这样做会影响性能。如果显示当前查询(我假设LIMIT用于获取前X个前导),我不明白
和($orderColumn,s.id)@草莓AND子句是一个seek谓词,可以避免使用LIMIT和OFFSET。禁用列应该在players表中,但我认为这样做会影响性能