Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Database design MySQL的大容量思想”;轮换;统计数据?_Database Design - Fatal编程技术网

Database design MySQL的大容量思想”;轮换;统计数据?

Database design MySQL的大容量思想”;轮换;统计数据?,database-design,Database Design,我有一个在线游戏,在那里我记录了很多游戏状态。这些统计数据表很快就会变大,我必须小心,因为只要记录更多的统计数据,一旦数据表变得足够大,就会导致游戏性能变得非常糟糕 我的策略不是很好,就是保持统计表的小型化。我有一个自动过程,每24小时创建一个新表,防止性能失控。但我的解决方案很难看,是一种统计表的“轮换”。我使用innodb并设置了几个索引来提高性能,然后我只保留了其中的30个表(每个表都是24小时的,所以我保存了一个月的统计数据)。每隔24小时,我的自动过程会删除“stats30”表,然后重

我有一个在线游戏,在那里我记录了很多游戏状态。这些统计数据表很快就会变大,我必须小心,因为只要记录更多的统计数据,一旦数据表变得足够大,就会导致游戏性能变得非常糟糕

我的策略不是很好,就是保持统计表的小型化。我有一个自动过程,每24小时创建一个新表,防止性能失控。但我的解决方案很难看,是一种统计表的“轮换”。我使用innodb并设置了几个索引来提高性能,然后我只保留了其中的30个表(每个表都是24小时的,所以我保存了一个月的统计数据)。每隔24小时,我的自动过程会删除“stats30”表,然后重命名所有编号的表以获得更高的编号,然后创建一个新的空白表,称为“stats”。这是一个“实时”表,统计数据被积极地记录到该表中

这些表基本上记录了游戏中每个玩家和其他玩家之间的每一笔交易,因此数据呈指数级增长。当一个新的交易发生时,它会检查这两个玩家之间是否已经有一行交易。如果有,它将使用对其事务的更改来更新行。否则,它将创建一个新行。一对一天互动1000次的玩家和一对只互动一次的玩家在当天的表格中都只有一行。数据库上的每个操作都涉及一个SELECT,然后是一个UPDATE或INSERT,因此按照当前的设计,在读写之间相当平衡。相对于单个选择、更新和插入,更大意义上的数据读取,即统计数据和多个玩家的分析很少进行。每天大约创建150000行

我知道这样会更好。我无法轻松减少记录的数据量,但我关心的是1.性能和2.简单性。例如,我可以通过每4小时创建一个新表来提高性能,但之后我不得不处理180个表。相反,我可以通过使用一张桌子使它变得更简单,然后所有的东西都突然停止了

请注意,我确实需要更新这些表中的行,因此我不能使用归档存储引擎之类的东西,但我只需要插入或更新“live”stats表

还有一个小问题是,当每日轮换过程发生时,此时出现的任何查询都可能丢失。(如果正在重命名所有表并创建一个新表,新条目可能会失败。)丢失一些插入不是大问题,但如果不发生此错误或可以“原子化”完成,则解决方案会更好


谢谢你提出的任何可能有帮助的想法!:)

没有数据库专家,但是您是否尝试过使用不同的数据库引擎(innoDB很慢,请尝试myISAM)并确保您选择的数据已被索引

这似乎是一个愚蠢的问题,但是,你的解决方案是相当疯狂的


还可以尝试以下方法:为了进行性能调整。

首先要做的是分析应用程序,找出实际花费时间最多的内容。如果另一个更改可以提供更好的性能,那么继续此表旋转是没有用的

运行所有查询,确保您了解结果和结果

我也强烈建议你阅读这本书。它提供了许多有关如何配置服务器以获得最佳性能的提示,并可能让您了解可能导致性能瓶颈的原因


如果实时表的性能确实存在问题,并且需要减少该表中的行数,那么只需将行移动到存档表中即可。这样,您总是有一个苗条的活动表。并且可以轻松地在归档文件上运行更长时间的查询。

我们这里讨论的是多少行?数以百万计的?几十万


因为您说过只需要更新live表中的行,所以听起来您可能只需要两个表就可以做到这一点—live stats表和StatArchive表。然后,批处理作业将定期将行从live stats表移动到stats_归档表。另一个作业可以在归档表中的行达到某个年龄后清除这些行。第三个任务是定期重新计算存档表上的统计信息,以确保MySQL能够为您的查询生成良好的计划,这也是一个好主意。

我想了解更多关于您的域的信息,以给出更准确的答案。但简而言之,您需要基于月份、年份或地理位置进行某种分区。因此,属于某个特定城市的所有用户统计数据都将进入这些表中。这样,您的选择可以变得更快

当然,关于添加索引的常见用法


告诉我更多,我也许能帮你…

每天15万行,一行的平均大小是多少? 这些行是否包含冗余数据,您只需保留引用就可以将其最小化

总的来说,保持表小总是一件好事,这样索引更新就会快速进行。此外,正如Ben S在上面提到的,您的查询至少应该进行优化,以便无法访问缺少索引的列等。如果启用了,您可以使用EXPLAIN和mysql服务器的慢速查询日志来发现一些可能的问题

memcached守护进程可能有助于解决性能问题。使用它,您可以延迟对数据库的写入,从而消除一些蒸汽,仍然不会受到脏缓存等问题的影响。尽管这取决于您正在使用的应用程序框架(如果有的话),但它需要一些工作来将其实现到您的应用程序中

作存档及统计用途