本地数据库与 Amazon RDS

CQM*_*CQM 6 mysql database-recommendation amazon-rds

我正在对本地 MySQL 数据库进行大型 INSERT

我有 2,000,000 行,现在我真的开始注意到速度变慢了。我一直听说 MySQL 的可扩展性不是很好

我希望这个数据库变得更大,而且我还有很多东西要插入

在这里使用亚马逊微型实例会有什么好处吗?

我不认为我的上传速度会成为瓶颈,所以我的逻辑是他们的分布式处理将使数据库更快。

事实证明,这更多是 CPU 利用率问题,但亚马逊的解决方案是否会更好,也许会针对更多可用处理器进行更优化?使用此逻辑,更昂贵的实例将具有更好的性能

但是这里涉及这么多变量,有没有人有这方面的经验要说?

Rol*_*DBA 10

您应该完全调整 MySQL 环境,尤其是您的 InnoDB 设置。(有关调整技巧,请参阅我的答案底部)。这比与亚马逊争夺 RAM/磁盘中的肘部空间要好得多。我为什么说打架?

如果您刚刚启动了一个 MySQL 的 Amazon RDS 实例,您将受到任何给定的限制。MySQL Amazon RDS 的所有型号的主要选项都相同,但仅在两个方面有所不同

  • 最大连接数
  • innodb_buffer_pool_size

这是我一周前发布的图表:https : //dba.stackexchange.com/a/21498/877

MODEL      max_connections innodb_buffer_pool_size
---------  --------------- -----------------------
t1.micro   34                326107136 (  311M)
m1-small   125              1179648000 ( 1125M,  1.097G)
m1-large   623              5882511360 ( 5610M,  5.479G)
m1-xlarge  1263            11922309120 (11370M, 11.103G)
m2-xlarge  1441            13605273600 (12975M, 12.671G)
m2-2xlarge 2900            27367833600 (26100M, 25.488G)
m2-4xlarge 5816            54892953600 (52350M, 51.123G)
Run Code Online (Sandbox Code Playgroud)

模型越大,InnoDB 缓冲池就越大。哦,是的,预算需要越大。

大多数人不知道的是,所有模型的 InnoDB 事务日志文件的大小都相同:128M。给定默认设置 ( innodb_log_files_in_group = 2),即 256M 的事务日志空间。如果您希望设置其他 InnoDB 选项,请执行以下操作:

  • 创建自定义数据库参数组(称之为MySettings
  • 下载 RDS CLI 并使用您的 AWS 凭证设置配置文件
  • 执行以下操作: ./rds-modify-db-parameter-group MySettings --parameters "name=<InnoDB Option>,value=???,method=immediate"
  • 使用数据库参数选项列表进行修改 MySettings
  • 重启 MySQL RDS 实例

那是为了你以后的考虑。

至于您手头的导入问题,AWS RDS 文档提供了许多避免导入缓慢的建议,包括:

  • 在加载之前创建所有二级索引。这对于熟悉其他数据库的人来说是违反直觉的。添加或修改二级索引会导致 MySQL 使用索引更改创建一个新表,将数据从现有表复制到新表,并删除原始表。
  • 按 PK 顺序加载数据。这对于 InnoDB 表特别有帮助,其中加载时间可以减少 75-80%,数据文件大小减少一半。
  • 禁用外键约束 foreign_key_checks=0 对于使用 LOAD DATA INFILE 加载的平面文件,这在许多情况下是必需的。对于任何负载,禁用 FK 检查将提供显着的性能提升。只需确保启用约束并在加载后验证数据。
  • 除非已经接近资源限制,否则并行加载。适当时使用分区表。
  • 使用 SQL 加载时使用多值插入以最小化语句执行开销。使用 mysqldump 时,这是自动完成的。
  • 减少 InnoDB 日志 IO innodb_flush_log_at_trx_commit=0

我希望您不要LOAD DATA INFILE用于导入。为什么 ?因为,只有 MyISAM 表与批量插入缓冲区(默认为 8M)一起受益于它。InnoDB 没有从中受益。

如果您通过 mysqldump 或您自己的 SQL 加载 InnoDB 表,那么一切都很好。如果您要批量执行大型交易,您可能需要像我解释的那样扩展交易日志。

作为旁注,如果 AWS 正在执行快照,请不要执行任何大型交易。您应该确保正确安排快照,然后提交不在快照窗口内执行任何大型事务。您可以在批量交易期间禁用快照,但AWS RDS 文档对此有一个很大的警告:

警告:如果您需要保留执行时间点恢复的能力,请勿禁用自动备份。禁用自动备份会擦除所有现有备份,因此在禁用自动备份后将无法进行时间点恢复。禁用自动备份是一种性能优化,数据加载不需要。请注意,禁用自动备份不会影响数据库快照。所有现有的数据库快照仍可用于还原。

禁用自动备份将减少大约 25% 的加载时间并减少加载期间所需的存储空间量。如果您要将数据加载到不包含数据的新数据库实例中,禁用备份是一种加快加载速度并避免使用备份所需的额外存储空间的简单方法。但是,如果您要加载到已经包含数据的数据库实例中;您必须权衡禁用备份的好处与失去执行时间点恢复能力的影响。

默认情况下,数据库实例启用了自动备份(保留期为一天)。为了禁用自动备份,您必须将备份保留期设置为零。加载后,您可以通过将备份保留期设置为非零值来重新启用备份。为了启用或禁用备份,Amazon RDS 必须关闭数据库实例并重新启动它以打开或关闭 MySQL 日志记录。

使用 rds-modify-db-instance 命令将备份保留设置为零并立即应用更改。将保留期设置为零需要重启数据库实例,因此请等待重启完成后再继续。

rds-modify-db-instance AcmeRDS --apply-immediately --backup-retention-period=0 您可以使用 rds-describe-db-instances 命令检查数据库实例的状态。该示例显示 AcmeRDS 数据库实例的状态并包括 --headers 选项以显示列标题。

结语

这是我过去关于调优 InnoDB 的帖子: