Arg*_*rth 5 mysql sql database amazon-aurora
在此先感谢您的回答,并为我的英语不好对不起,我不是母语人士。
我们实际上是在开发带有后端的手机游戏。在此手机游戏中,我们有一个货币系统,我们会跟踪每笔交易以进行验证。
为了读取用户余额,我们有一个中间表,该表中的每笔交易都会更新用户余额,因此用户永远不会直接读取交易表,以减轻高流量的负担。
事务表在后台不时地唯一读取。
这是事务表的架构:
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
);
Run Code Online (Sandbox Code Playgroud)
我们计划有很多用户,交易表可能会增长到10亿行,所以我的问题是:
您可以考虑 MyRocks(参见http://myrocks.io),它是一个第三方存储引擎,专为快速插入速度和压缩数据存储而设计。我不会建议您切换到 MyRocks,因为我没有足够的信息来针对您的工作负载做出明确的声明。但我建议您花时间评估它,看看它是否更适合您的应用程序。
\n\n\n\n\n如果数据库太大而无法放入 RAM,MySQL 是否有某种优化,仅将最常读取的表存储在 RAM 中?
\n
是的,MySQL(假设为 InnoDB 存储引擎)将部分表存储在 RAM 中的缓冲池中。它将表分解为页面,并根据查询请求将页面放入缓冲池中。它就像一个缓存。随着时间的推移,请求最多的页面会保留在缓冲池中,而其他页面会被驱逐。因此,它或多或少会平衡以尽快满足您的大部分查询。阅读https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html了解更多信息。
\n\n\n\n\n会影响其他表的性能吗?
\n
表没有性能\xe2\x80\x94查询有性能。
\n\n缓冲池有固定的大小。假设您有六个需要共享的表,它们的页面必须适合同一个缓冲池。无法为每个表设置优先级,也无法为某些表指定缓冲池空间或将它们“锁定”在 RAM 中。所有表的所有页共享相同的缓冲池。因此,当您的查询从各个表请求页面时,它们确实会相互影响,因为一个表中频繁请求的页面可能会逐出另一个表中的页面。
\n\n\n\n\nMySQL 是否能够正确扩展到这十亿行?
\n
MySQL 有许多功能来尝试提高性能和可扩展性(这些不是同一件事)。再次强调,查询具有性能,而不是表。没有查询的表就放在那里。这是通过不同技术优化的查询。
\n\n\n\n\n知道我们主要执行插入操作,并且唯一的索引位于 id 上(详细信息需要 id),并且没有“批量插入”(在该表上不会同时执行 1M 插入操作)
\n
索引确实会增加插入的开销。你无法消除主键索引,这是每个表的必要部分。但例如,您可能会发现值得删除包含索引的外键。
\n\n通常,大多数表的读取次数多于写入次数,因此值得保留索引来帮助读取(甚至是使用 WHERE 子句的 UPDATE 或 DELETE)。但是,如果您的工作负载实际上都是 INSERT,那么外键的额外索引可能纯粹是开销,并且不会为任何查询带来任何好处。
\n\n\n\n\n此外,我们使用 RDS 服务器,因此我们可以切换到 Aurora 并根据需要尝试主-主或主-从复制。您认为在这种情况下会有帮助吗?
\n
我在 2017 年初对 Aurora 进行了基准测试,发现对于我们测试的应用程序来说,它不适合高写入流量。您应该始终针对您的应用程序对其进行测试,而不是依赖于互联网上某人的猜测。但我预测当前形式的 Aurora(大约 2017 年)将完全无法满足您的全写工作负载。
\n