【问题标题】:MySQL Partition Highscore TableMySQL 分区高分表
【发布时间】:2012-08-13 08:11:44
【问题描述】:

我有一个存储游戏高分的表格。这个游戏有很多关卡,分数按分数 DESC(这是一个索引)排序,其中关卡是关卡 ID。在此级别 ID 列上进行分区会创建与创建许多单独级别表(每个级别 ID 一个)相同的结果吗?我需要这个来以某种方式分离出关卡数据,因为我预计会有 10 的数百万个条目。我听说分区可以加快这个过程,同时让我的表正常化。

另外,我的游戏中的关卡数量未知(可以随时添加或删除关卡)。我可以指定在此级别 ID 列上进行分区,并在将新的(不同级别 ID)添加到高分表时自动创建新分区吗?我可能从 10 个单独的级别开始,但最终以 50 个级别结束,但我所有的数据仍然保存在一个表中,但是有很多分区吗?我是否必须为关卡 ID 编制索引才能完成这项工作?

提前感谢您的建议!

【问题讨论】:

    标签: php mysql database database-partitioning


    【解决方案1】:

    在单列上创建索引很好,但根据您提供的信息,创建包含两列的索引将是更好的解决方案。我会运行一个

    alter table highscores add index(columnScore, columnLevel);
    

    这将使性能更好。从数据库的角度来看,无论您在寻找什么高分,数据库都会知道在哪里搜索它们。

    就此而言,如果可以(并且您正在使用 mysami 表),您还可以运行:

    alter table order by columnScore, columnLevel;
    

    然后它将所有数据组合在一起,这样即使数据库知道每个位的位置,它也可以找到附近属于彼此的所有记录 - 这意味着更少的硬盘驱动器工作 - 因此更快的结果。

    第二次手术也会产生巨大的影响。我的工作电脑(90 年代顶级的可怕旧机器)有一个数据库,里面有几百万条记录,我建立了 - 没什么大不了的,大约 2.5gb 的数据,包括索引 - 性能很差,但订购索引的数据将查询时间从每次查询约 1.5 分钟缩短到约 8 秒。这仅仅是因为硬盘驱动器速度能够到达包含数据的所有扇区。

    【讨论】:

    • 您好,我无法执行“更改表”,因为我正在使用只读副本,这将为只读副本创建大量更改以跟上。
    • 并非如此,alter table(至少是第一个)可能会磨合一段时间,但这将是一次性操作。在那之后,他们应该会没事的。第二个(假设您在云上运行)可能对您来说并不那么重要 - 尽管如果他们使用的 RAID 阵列性能较慢,它可能会有所帮助......
    • 好吧,这很有趣! “更改表”和像这样排序分数是否也意味着我的索引也必须重新创建?比如说,我有一个关于“scoreID”和“scores”的索引?
    • @AndyBarlow 创建复合索引将创建索引,是的。 alter by 语句(重新排序)根本不会更改任何索引,只是重新排序其中的数据。
    • 抱歉,我不是很清楚。我的意思是“更改表顺序”。如果我要使用“alter table”来创建一个新列,那会影响我已经存在的索引吗? (有点不相关的问题,我知道)
    【解决方案2】:

    如果您打算为不同的用户存储数据,那么有 2 个表怎么样 - 一个包含有关不同级别的所有信息,另一个包含每个用户的一行以及他在 XML/json 中的分数?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多