RDS for MySQL参数调优建议
说明数据库参数是数据库系统运行的关键配置信息,设置不合适的参数值可能会影响业务。本文列举了一些重要参数说明,更多参数详细说明,请参见MySQL官网。
修改敏感参数
若干参数相关说明如下:
- “lower_case_table_names”
云数据库默认值 :“1”。
作用 :该参数表示创建数据库及表时,表存储是否大小写敏感。默认值“1”,表示创建数据库及表时,默认小写,不区分大小写。
说明RDS for MySQL 8.0版本不支持该参数。
影响: 修改该参数可能会导致主从复制异常,请谨慎修改。如果必须要修改,请根据以下场景设置数据库参数:
参数值从1变为0的设置顺序:先修改和重启只读库,后修改和重启主库。
参数值从0变为1的设置顺序:先修改和重启主库,在主库执行 SELECT @@GLOBAL.GTID_EXECUTED 。然后在只读库执行 SELECT @@GLOBAL.GTID_EXECUTED ,直到结果集合大于或者等于主库的SELECT @@GLOBAL.GTID_EXECUTED的结果集合,再修改和重启只读库。
- “innodb_flush_log_at_trx_commit”
云数据库默认值: “1”。
作用 :该参数控制提交操作在严格遵守ACID合规性和高性能之间的平衡。设置为默认值“1”,是为了保证完整的ACID,每次提交事务时,把事务日志从缓存区写到日志文件中,并刷新日志文件的数据到磁盘上;当设为“0”时,每秒把事务日志缓存区的数据写入日志文件,并刷新到磁盘;如果设为“2”,每次提交事务都会把事务日志从缓存区写入日志文件,每隔一秒左右会刷新到磁盘。
影响 :参数设置为非默认值“1”时,降低了数据安全性,在系统崩溃的情况下,可能导致数据丢失。
- “sync_binlog”
云数据库默认值 :“1”。
作用 :该参数控制MySQL服务器将二进制日志同步到磁盘的频率。设置为默认值“1”,表示MySQL每次事务提交,binlog同步写入磁盘,是最安全的设置;设置为“0”时,表示MySQL不控制binlog的刷新,由文件系统自己控制其缓存的刷新。此时的性能最好,但风险最大,因为一旦断电或操作系统崩溃,在“binlog_cache”中的所有binlog信息都会被丢失。
影响 :参数设置为非默认值“1”时,降低了数据安全性,在系统崩溃的情况下,可能导致binlog丢失。
- “innodb_large_prefix”
云数据库默认值 :“OFF”。
作用 :InnoDB表允许单列索引的最大长度。
说明仅RDS for MySQL 5.6版本支持该参数。
影响 :在DDL执行时修改该参数,有可能会导致主从复制异常,请谨慎修改。如果必须要修改,请根据以下场景设置数据库参数:
参数值从OFF变为ON的设置顺序:先修改只读库,后修改主库。
参数值从ON变为OFF的设置顺序:先修改主库,后修改只读库。
修改性能参数
若干参数相关说明如下:
- “innodb_spin_wait_delay”和“query_alloc_block_size”依赖于实例的规格,设置过大时,可能会影响数据库的使用。
- “max_connections”参数值设置较小,将影响数据库访问。
- “innodb_buffer_pool_size”、“max_connections”和“back_log”参数依赖于实例的规格,实例规格不同对应其默认值也不同。因此,这些参数在用户未设置前显示为“default”。
- “innodb_io_capacity_max”、“innodb_io_capacity”参数依赖于磁盘类型,用户未设置前显示为“default”。
参数修改限制
- “innodb_adaptive_hash_index”和“innodb_buffer_pool_size”参数同时修改时,“innodb_adaptive_hash_index”的值由“OFF”改为“ON”会失败。
- “innodb_buffer_pool_size”参数值必须是“innodb_buffer_pool_instances”和“innodb_buffer_pool_chunk_size”参数值乘积的整数倍。
- “innodb_buffer_pool_instances”参数值设置为“2”时,“innodb_buffer_pool_size”值必须大于等于1GB。
- “max_prepared_stmt_count”:对于MySQL 8.0版本,如果内核版本低于8.0.18,参数取值上限为1048576,超过会修改失败。
RDS支持的最大IOPS是多少
关系型数据库服务支持的IOPS取决于云硬盘(Elastic Volume Service,简称EVS)的IO性能,具体请参见《云硬盘产品介绍》中“磁盘类型及功能特性”的内容。
如何提高RDS数据库的查询速度
可以参考如下建议:
- 如果产生了慢日志,可以通过查看慢日志来确定是否存在运行缓慢的SQL查询,以及各个查询的性能特征,从而定位查询运行缓慢的原因。
- 查看云数据库RDS实例的CPU使用率指标,协助定位问题。
- 可以创建只读实例专门负责查询,减轻主实例负载,分担数据库压力。
- 如果是实例规格较小但负载过高,您可以提高CPU/内存规格。
- 多表关联查询时,关联字段要加上索引。
- 可以指定字段或者添加where条件进行查询,避免用select*语句进行全表扫描。
排查RDS for MySQL CPU使用率高的原因和解决方法
使用云数据库RDS for MySQL时,如果您的CPU使用率很高或接近100%,会导致数据读写处理缓慢、连接缓慢、删除出现报错等,从而影响业务正常运行。
解决方法
分析慢SQL日志以及CPU使用率指标来定位效率低的查询,再优化查询效率低的语句。
- 查看慢SQL日志来确定是否存在运行缓慢的SQL查询以及各个查询的性能特征(如果有),从而定位查询运行缓慢的原因。
- 查看关系型数据库实例的CPU使用率指标,协助定位问题。
- 创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。
- 多表关联查询时,关联字段要加上索引。
- 尽量避免用select*语句进行全表扫描,可以指定字段或者添加where条件。
RDS for MySQL数据库内存使用率过高怎么处理
对于用户核心业务相关的库
请扩容实例规格。
对于非用户核心业务相关的库
查看本地计算机的内存使用率,如果使用率曲线持续平缓,则无需处理。
对于用户核心业务相关但是数据库规格配置很高的库
- 在业务低峰期,将数据库参数“performance_schema”的值调整为“OFF”,对于RDS for MySQL 5.6及以下版本,需要重启数据库才能生效。
- 通过CES监控面板,观察实例的内存使用情况。
如果实例的内存使用率仍持续保持较高,请扩容实例规格。
调整数据库参数“innodb_buffer_pool_size”的值:
- 数据库实例为2GB规格,参考值268,435,456 Byte(256MB)。
- 数据库实例为4GB规格,参考值1,073,741,824 Byte(1GB)。
- 数据库实例为8GB规格,参考值3,221,225,472 Byte(3GB)。
- 数据库实例内存大于8GB规格,则无需调整。
注意
请根据业务实际情况,调整参数“innodb_buffer_pool_size”的值。
MySQL本身具有内存动态平衡机制,90%以下您可无需关注。
RDS for MySQL的内存分配可划分为Engine层与Server层。
Engine层的内存包括InnoDB Buffer Pool、Log Buffer、Full Text Index Cache,其中InnoDB Buffer Pool为常驻内存,占用内存较大。
InnoDB缓冲池是一个内存区域,用于保存InnoDB表、索引和其他辅助缓冲区的缓存数据,可以通过参数“innodb_buffer_pool_size”定义缓冲池大小。
- Server层的内存占用较高的包括Thread Cache、BinLog Cache、Sort Buffer、Read Buffer、Join Buffer等线程缓存,这类缓存非常驻内存,往往会随着连接关闭而释放。
以上内存的分配导致RDS for MySQL实例运行时内存使用率在80%左右。
RDS实例磁盘满导致实例异常的解决方法
问题现象
RDS数据库的磁盘空间满,导致实例变为只读状态,应用无法对RDS数据库进行写入操作,从而影响业务正常运行。
问题原因
- 业务数据增加。
- 数据空间占用过大。
- 由于大量的事务和写入操作产生了大量的RDS for MySQL Binlog日志文件。
- 应用中存在大量的排序查询,产生了过多的临时文件。
解决方案
- 随着业务数据的增加,原来申请的数据库磁盘容量可能会不足,建议用户扩容磁盘空间,确保磁盘空间足够。
如果原有规格的磁盘已是最大,请先升级规格。
- 针对数据空间过大,可以删除无用的历史表数据。
- 如果实例变为只读状态,您需要先联系技术支持解除只读状态;如果实例非只读状态,则可以直接执行删除操作。
- 可在业务低峰期对碎片率高的表执行optimize优化,以便释放空间:
清理整张表使用DROP或TRUNCATE操作;删除部分数据,使用DELETE操作,如果是执行DELETE操作,需要使用OPTIMIZE TABLE来释放空间。
- 如果是RDS for MySQL Binlog日志文件占用过多,可以清理本地Binlog日志,来释放磁盘空间。
- 针对大量排序查询导致的临时文件过大,建议优化SQL查询。
SQL异常
- 原因及现象
SQL异常的原因很多,例如库表结构设计不合理、索引缺失、扫描行数太多等。
您可以在控制台的慢日志页面,下载并查看执行缓慢的SQL,慢SQL的执行耗时等信息。。
- 解决方案
根据实际业务情况优化SQL。
实例瓶颈
- 原因及现象
实例到达瓶颈的原因一般有如下几种:
业务量持续增长而没有扩容。
硬件老化,性能有损耗。
数据量一直增加,数据结构也有变化,导致原来不慢的SQL变成慢SQL。
您可以在控制台的查看实例的资源使用情况。如果资源使用率各项指标都接近100%,可能是实例到达了瓶颈。
- 解决方案
确认实例到达瓶颈后,建议升级实例规格。
版本升级
- 原因及现象
实例升级版本可能会导致SQL执行计划发生改变,执行计划中连接类型从好到坏的顺序是system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all。更多信息,请参见MySQL官方文档。
range和index连接类型时,如果SQL请求变慢,业务又不断重发请求,导致并行SQL查询比较多,会导致应用线程释放变慢,最终连接池耗尽,影响整个业务。
您可以在控制台的查看实例的当前连接数指标。
- 解决方案
根据执行计划分析索引使用情况、扫描的行数等,预估查询效率,重构SQL语句、调整索引,提升查询效率。
参数设置不当
- 原因及现象
部分参数(如innodb_spin_wait_delay)设置不当会导致性能变慢。
您可以在控制台查看实例的参数修改情况。
- 解决方案
调整相关参数,使其适合业务场景。
批量操作
- 原因及现象
如果有大批量的数据导入、删除、查询操作,会导致SQL执行变慢。
您可以在控制台查看实例的磁盘总大小、磁盘使用量、IOPS等指标。
- 解决方案
在业务低峰期执行大批量操作,或将大批量操作拆分后分批执行。
定时任务
- 原因及现象
如果实例负载随时间有规律性变化,可能是存在定时任务。
您可以在控制台查看实例的Delete语句执行频率、Insert语句执行频率、Insert_Select语句执行频率、Replace语句执行频率、Replace_Selection语句执行频率、Select语句执行频率、Update语句执行频率等指标,判断是否有规律性变化。
- 解决方案
调整定时任务的执行时间,建议在业务低峰期执行,并修改可维护时间段为业务低峰期。