我有一个表格,用于存储游戏的高分。这个游戏有很多级别,然后分数按分数 DESC(这是一个索引)排序,其中级别是级别 ID。 在此级别 ID 列上进行分区是否会创建与创建许多单独的级别表(每个级别 ID 一个)相同的结果?我需要它以某种方式分离出级别数据,因为我预计会有 10 个数百万个条目。我听说分区可以加快这个过程,同时让我的表正常化。
此外,我的游戏中的关卡数量未知(关卡可能随时添加或删除)。是否可以指定在此级别 ID 列上进行分区,并在将新的(不同的级别 ID)添加到高分表时自动创建新分区?我可能从 10 个单独的级别开始,但最终以 50 个级别结束,但我的所有数据仍然保存在一个表中,但许多分区?我是否必须为级别 ID 编制索引才能完成此操作?
提前感谢您的建议!
在单个列上创建索引很好,但根据您提供的信息创建包含两列的索引将是一个更好的解决方案。我会运行一个
alter table highscores add index(columnScore, columnLevel);
这将使性能更好。从数据库的角度来看,无论您要查找什么高分,数据库都会知道在哪里搜索它们。
在这一点上,如果可以的话(并且您正在使用mysami表),您还可以运行:
alter table order by columnScore, columnLevel;
然后,它将把你的所有数据分组在一起,这样即使数据库知道每个位在哪里,它也可以找到附近属于彼此的所有记录 - 这意味着更少的硬盘工作 - 因此结果更快。
第二次手术也可以产生巨大的影响。我在工作的电脑(可怕的旧机器,在九十年代是顶级的)有一个数据库,里面有我构建的数百万条记录 - 没什么大不了的,大约 2.5GB 的数据,包括索引 - 并且性能下降,但对索引的数据进行排序将查询时间从每次查询约 1.5 分钟缩短到大约 8 秒。这只是由于硬盘驱动器的速度能够访问包含数据的所有扇区。
如果您打算存储不同用户的数据,那么拥有 2 个表格怎么样 - 一个包含有关不同级别的所有信息,另一个包含每个用户的一行以及他在 XML/JSON 中的分数?