Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Amazon Aurora - Fatal编程技术网

MySQL在大型只写表上的性能

MySQL在大型只写表上的性能,mysql,sql,database,amazon-aurora,Mysql,Sql,Database,Amazon Aurora,提前谢谢你的回答,很抱歉我的英语不好,我不是以英语为母语的人 我们正在开发一款带有后端的手机游戏。在这个手机游戏中,我们有一个货币系统,我们跟踪每一笔交易以进行验证 为了读取用户余额,我们有一个中间表,其中用户余额在每个事务上都会更新,因此用户永远不会直接读取事务表,以减少高流量的负载 事务表是在后台办公室中不时唯一读取的 以下是事务表的架构: create table money_money_transaction ( `id` BIGINT UNSIGNED A

提前谢谢你的回答,很抱歉我的英语不好,我不是以英语为母语的人

我们正在开发一款带有后端的手机游戏。在这个手机游戏中,我们有一个货币系统,我们跟踪每一笔交易以进行验证

为了读取用户余额,我们有一个中间表,其中用户余额在每个事务上都会更新,因此用户永远不会直接读取事务表,以减少高流量的负载

事务表是在后台办公室中不时唯一读取的

以下是事务表的架构:

create table money_money_transaction (
  `id`              BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  `userID`          INT UNSIGNED NOT NULL,
  `amount`          INT NOT NULL,
  `transactionType` TINYINT NOT NULL,
  `created`         DATETIME NOT NULL,

  CONSTRAINT money_money_transaction_userID FOREIGN KEY (`userID`) REFERENCES `user_user` (`id`)
    ON DELETE CASCADE
);
我们计划有很多用户,事务表可以增长到10亿行,所以我的问题是:

  • 它会影响其他表的性能吗
  • 如果数据库太大,无法装入RAM,MySQL是否进行了某种优化,只在RAM中存储读取次数最多的表
  • MySQL能够正确地扩展到这十亿行吗?知道我们主要进行插入,唯一的索引是在id上(详细信息需要id),并且没有“批量插入”(此表上不会同时进行1M插入)
  • 此外,我们在RDS服务器上,因此如果需要,我们可以切换到Aurora并尝试主-主或主-从复制。你认为在这种情况下会有帮助吗

您可以考虑MyRooRekes(见),这是一个专为快速插入速度和压缩数据存储设计的第三方存储引擎。我不会建议你改用MyRocks,因为我没有足够的信息来明确说明你的工作量。但我建议您花时间对它进行评估,看看它是否更适合您的应用程序

如果数据库太大,无法装入RAM,MySQL是否进行了某种优化,只在RAM中存储读取次数最多的表

是的,MySQL(假设InnoDB存储引擎)将部分表存储在RAM中的缓冲池中。它将表分解为页面,并在查询请求时将页面放入缓冲池。它就像一个缓存。随着时间的推移,请求最多的页面会留在缓冲池中,其他页面会被逐出。因此,它或多或少地平衡了您的大部分查询,以尽可能快地提供服务。阅读了解更多信息

它会影响其他表的性能吗

表没有性能-查询有性能

缓冲池具有固定大小。假设您有六个表需要共享它,那么它们的页面必须放在同一个缓冲池中。无法为每个表设置优先级,也无法为某些表指定缓冲池空间,也无法将它们“锁定”在RAM中。所有表的所有页共享相同的缓冲池。因此,当您的查询从不同的表中请求页面时,它们确实会相互影响,因为从一个表中频繁请求的页面可能会从另一个表中逐出页面

MySQL能够正确地扩展到这十亿行吗

MySQL有许多特性可以帮助提高性能和可伸缩性(这两个特性是不同的)。同样,查询具有性能,而不是表。一张没有查询的桌子就在那里。正是这些查询通过不同的技术得到了优化

知道我们主要进行插入,唯一的索引是在id上(详细信息需要id),并且没有“批量插入”(此表上不会同时进行1M插入)

索引确实会增加插入的开销。不能删除主键索引,它是每个表的必要部分。但例如,您可能会发现删除包含索引的外键是值得的

通常,大多数表的读取量大于写入量,因此保留索引以帮助读取(甚至是使用WHERE子句的更新或删除)是值得的。但是,如果您的工作负载实际上都是INSERT,那么外键的额外索引可能纯粹是开销,对任何查询都没有好处

此外,我们在RDS服务器上,因此如果需要,我们可以切换到Aurora并尝试主-主或主-从复制。你认为在这种情况下会有帮助吗


2017年初,我研究了Aurora的基准测试,发现对于我们测试的应用程序来说,is不适合高写入流量。您应该始终为您的应用程序测试它,而不是依赖于互联网上某人的猜测。但我预测,目前形式的Aurora(大约2017年)将完全无法满足您所有的写工作负载。

基本上这是一个日志记录表?你有没有在一切照旧的情况下阅读过这本书?因此,它真的需要外键约束吗?为什么适应RAM很重要(只有经常从中读取时才会缓存到RAM)。MySQL是否能够很好地扩展取决于您如何使用它,没有更多的信息,我们只能说“它可以,是的,但您可以表示它不…”,而不知道您将如何使用此表(您只描述了如何不使用它),不可能知道其他选项是否更适合您。您好,谢谢您的回答。实际上,这是一种日志表,只有当用户帐户有可疑活动时,我们才会读取它。此查询和数据完整性需要外键约束(如果用户要求,可以删除)。我可能表达得很糟糕,但我的问题的目的更多的是“MySQL是否会在RAM中存储更重要的表”,因此根据您的回答,这似乎是好的。您可能“想要”外键,但如果您关心写入此表的量,则不“需要”跟踪可疑活动的外键.Analysis不是BAU,如果您正在调查一个用户,您将知道该用户存在。如果您删除了一个用户,则可以在夜间或每周的批处理过程中清除孤立记录。等等,e