2012-08-13 48 views
2

我有一张存储游戏高分的表格。这个游戏有很多级别,其中分数然后通过分数DESC(这是一个索引)进行排序,其中级别是级别ID。在这个级别ID列上进行分区会创建与创建许多独立级别表(每个级别ID一个)相同的结果吗?我需要这个以某种方式分离出关卡数据,因为我预计有数百万条记录。我听说分区可以加快这个过程,同时让我的表格正常化。另外,我的游戏中有一个未知数量的级别(级别可能随时添加或删除)。我可以指定在这个级别ID列上进行分区,并且在新的(不同级别ID)添加到高级表时,可以创建新的分区automaticaly吗?我可能从10个单独的关卡开始,但最终得到50个,但是我的所有数据仍然保存在一张表中,但是有多个分区?我是否需要对级别ID进行索引才能使其工作?MySQL分区高分表

在此先感谢您的建议!

回答

1

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

alter table highscores add index(columnScore, columnLevel); 

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

关于这一点,如果可以的话,(你正在使用mysami表),你也可以运行一个:

alter table order by columnScore, columnLevel; 

这将随后组中的所有数据一起,这样即使数据库知道在哪里每一位都可以找到附近所有属于彼此的记录 - 这意味着更少的硬盘驱动器工作 - 因此可以更快地获得结果。

那第二次操作也会造成巨大的差异。我的个人电脑在工作(九十年代最糟糕的老机器)有一个数据库,里面有数百万条记录 - 没有什么大的,大约2.5GB的数据包括索引 - 而且性能在拖拽,但是订购这些索引的数据将查询时间从每个查询大约1.5分钟提高到大约8秒。这只是因为硬盘速度能够到达包含数据的所有扇区。

+0

你好,我不能做一个“改变表”,因为我正在使用只读副本,这将为读取副本创建大量更改以跟上。 – Schodemeiss 2012-08-13 08:26:13

+0

不是,换个表(至少是第一个表)可能会磨掉一段时间,但它会是一次性的操作。之后,他们应该没事。第二个(假设你正在运行一个云)对你来说可能并不重要 - 尽管如果他们使用的RAID阵列性能较差,它可能会有所帮助...... – Fluffeh 2012-08-13 08:36:46

+0

好的,这很有趣!做一个“改变表”和排序这样的分数也意味着我的索引也必须重新创建?说,我有一个关于“scoreID”和“分数”的索引? – Schodemeiss 2012-08-13 08:57:23

0

如果你打算存储不同用户的数据,那么有两张表 - 一个关于不同级别的所有信息,另一个关于每个用户的一行以及XML/json中的分数?