
# RDS for MySQL参数调优建议
数据库参数是数据库系统运行的关键配置信息，设置不合适的参数值可能会影响业务。本文列举了一些重要参数说明，更多参数详细说明，请参见**[MySQL官网](https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html)**。
通过控制台界面修改MySQL参数值，请参见[修改RDS for MySQL实例参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)。
一部分参数修改后需要重启实例才能生效，具体是否需要重启请以界面提示为准。
#### lower_case_table_names
- 版本：5.7、5.6
- 参数说明：该参数表示创建库和表时，表名存储是否大小写敏感。
- 默认值：1
- 修改建议：修改该参数可能会导致主从复制异常，请谨慎修改。如果必须要修改，请根据以下场景设置数据库参数：
  - 默认值"1"，表示创建库和表时，表名默认存储为小写，且不区分大小写。
  
  - 参数值从1变为0的设置顺序：先修改和重启只读库，后修改和重启主库。
  
  - 参数值从0变为1的设置顺序：先修改和重启主库，在主库执行**SELECT @@GLOBAL.GTID_EXECUTED** 。然后在只读库执行**SELECT @@GLOBAL.GTID_EXECUTED** ，直到结果集合大于或者等于主库的**SELECT @@GLOBAL.GTID_EXECUTED**的结果集合，再修改和重启只读库。
   
 
#### innodb_flush_log_at_trx_commit
- 版本：8.0、5.7、5.6
- 参数说明：该参数控制提交操作在严格遵守ACID合规性和高性能之间的平衡。
- 默认值：1
- 修改建议：参数设置为非默认值"1"时，降低了数据安全性，在系统崩溃的情况下，可能导致数据丢失。
  - 设置为默认值"1"，是为了保证完整的ACID，每次提交事务时，把事务日志从缓存区写到日志文件中，并刷新日志文件的数据到磁盘上。
  
  - 设置为"0"时，每秒把事务日志缓存区的数据写入日志文件，并刷新到磁盘。
  
  - 设置为"2"时，每次提交事务都会把事务日志从缓存区写入日志文件，每隔一秒左右会刷新到磁盘。
   
 
#### sync_binlog
- 版本：8.0、5.7、5.6
- 参数说明：该参数控制MySQL服务器将二进制日志同步到磁盘的频率。
- 默认值：1
- 修改建议：设置为默认值"1"，表示MySQL每次提交事务时，将Binlog同步写入磁盘，是最安全的设置。 设置为"0"时性能最好，表示MySQL不控制Binlog的刷新，由文件系统自己控制其缓存的刷新，此时的性能最好，但风险最大，因为一旦断电或操作系统崩溃，在binlog_cache中的所有Binlog信息都会被丢失。
  
 
#### innodb_large_prefix
- 版本：5.6
- 参数说明：InnoDB表允许单列索引的最大长度。
- 默认值：OFF
- 修改建议：在DDL执行时修改该参数，有可能会导致主从复制异常，请谨慎修改。如果必须要修改，请根据以下场景设置数据库参数：
  - 参数值从OFF变为ON的设置顺序：先修改只读库，后修改主库。
  
  - 参数值从ON变为OFF的设置顺序：先修改主库，后修改只读库。
   
 
#### innodb_buffer_pool_size
- 版本：8.0、5.7、5.6
- 参数说明：该参数为Innodb缓冲池大小，用来缓存表和索引数据的内存区域，增加该值可减少磁盘I/O。
- 默认值：参数依赖于实例的规格，实例规格不同对应其默认值也不同。
- 修改建议：过大的buffer pool可能导致系统崩溃，请谨慎修改。该参数受innodb_buffer_pool_chunk_size \* innodb_buffer_pool_instances的影响，为两参数乘积的整数倍向上取值。 比如innodb_buffer_pool_chunk_size为"134217728"， innodb_buffer_pool_instances为"1"，那innodb_buffer_pool_size必须大于等于"134217728"。
  - innodb_adaptive_hash_index和innodb_buffer_pool_size参数同时修改时，innodb_adaptive_hash_index的值由"OFF"改为"ON"会失败。
  
  - innodb_buffer_pool_instances参数值设置为"2"时，innodb_buffer_pool_size值必须大于等于1GB。
   
 
#### innodb_buffer_pool_instances
- 版本：8.0、5.7、5.6
- 参数说明：
  - InnoDB中的数据访问以Page为单位，每个Page的大小默认为16KB，Buffer Pool用来管理和缓存这些Page。InnoDB将一块连续的内存大小划分给Buffer Pool来使用，并将其划分为多个Buffer Pool Instance来更好地管理内存，每个Instance的大小相等，通过算法保证一个Page只会在一个特定的Instance中，划分为多个Instance的模式提升了Buffer Pool的并发性能。
  
  - 每个Buffer Pool Instance中都会维护一个自己的Buffer Pool模块，InnoDB通过16KB Page的方式将数据从文件中读取到Buffer Pool，并通过一个LRU List来缓存这些Page。经常访问的Page在LRU List的前面，不经常访问的Page在后面。InnoDB访问一个Page时，首先会从Buffer Pool中获取，如果未获取到，则会访问数据文件，读取到Page，并将其put到LRU List中。当一个Instance的Buffer Pool中没有可用的空闲Page时，会对LRU List中的Page进行淘汰。
  
  - 每个Buffer Pool Instance中都有包含自己的锁：mutex，Buffer chunks，各个页链表。每个Instance之间独立，支持多线程并发访问，并且一个Page只会被存放在一个固定的Instance中。 每个Buffer Pool Instance中还包含一个page_hash的hash table，通过该page_hash能快速找到LRU List中的page，避免扫描整个LRU List，极大提升了Page的访问效率。
    
   
- 默认值：innodb_buffer_pool_instances的默认值和实例的内存规格相关，调整参数值会影响buffer pool的并发性能。
 
#### innodb_spin_wait_delay
- 版本：8.0、5.7、5.6
- 参数说明：自旋锁轮询间隔的最大延时。
- 默认值：无
- 修改建议：依赖于实例的规格，设置过大时，可能会影响数据库的使用。
 
#### query_alloc_block_size
- 版本：8.0、5.7、5.6
- 参数说明：查询解析与执行分配的块尺寸。
- 默认值：无
- 修改建议：依赖于实例的规格，设置过大时，可能会影响数据库的使用。
 
#### max_connections
- 版本：8.0、5.7、5.6
- 参数说明：允许同时连接的客户端总数。
- 默认值：参数依赖于实例的规格，实例规格不同对应其默认值也不同。
- 修改建议：系统内置连接数会占用一部分，不建议设置30以下，以避免并发连接冲突抢占。无法设置为小于当前连接数的值。
 
#### character_set_server
- 版本：8.0、5.7、5.6
- 参数说明：服务器字符集。
- 默认值：无
- 修改建议：修改该参数的值， 系统会联动调整collation_server、character_set_database,和collation_database的取值。 其中，character_set_server跟collation_server存在对应关系，collation_server的取值为以character_set_server值开头的字符序。例如：character_set_server为"latin1"时，collation_server的取值为以"latin1"开头的字符序。
  
 
#### innodb_io_capacity
- 版本：8.0、5.7、5.6
- 参数说明：每秒允许InnoDB进行I/O操作的最大数。
- 默认值：依赖于磁盘类型。
- 修改建议：该参数的取值必须小于等于innodb_io_capacity_max的取值。 比如innodb_io_capacity_max为"2000"， 则innodb_io_capacity最大设置为"2000"。
 
#### max_prepared_stmt_count
- 版本：8.0、5.7、5.6
- 参数说明：准备大量的语句会消耗服务器的内存资源，参数设置较小，会带来潜在的"拒绝服务"的风险，建议您根据业务情况，调整该参数的值。
- 默认值：无
- 修改建议：对于MySQL 8.0版本，如果内核版本低于8.0.18，参数取值上限为1048576，超过会修改失败。
 
#### innodb_strict_mode
- 版本：8.0、5.7、5.6
- 参数说明：用于限制InnoDB的检查策略。
- 默认值：OFF
- 修改建议：采用了页数据压缩功能后，建议开启该功能。
 
#### binlog_rows_query_log_events
- 版本：8.0、5.7、5.6
- 参数说明：该参数控制原始SQL是否记录到Binlog。
- 默认值：OFF
- 修改建议：开启时在特定大量数据更新等场景可能存在一定的性能劣化，修改该值应该考虑Otter等工具的兼容性。
 
#### innodb_print_all_deadlocks
- 版本：8.0、5.7、5.6
- 参数说明：启用此选项时，有关InnoDB用户事务中所有死锁信息都记录在mysqld错误日志中。
- 默认值：OFF
- 修改建议：参数默认关闭是为了避免频繁写日志导致的性能开销。开启后，如果系统中发生大量死锁，会增加日志写入的频率和IO开销，进而影响性能。如果记录所有死锁信息，会增加错误日志的大小，比如在高并发场景下死锁频繁发生时会导致磁盘空间快速消耗。在需要进行死锁分析和排查时，可以临时启用。
 
#### back_log
- 版本：8.0、5.7、5.6
- 参数说明：该back_log值表示在MySQL暂时停止回答新请求之前的很短时间内，有多少请求可以堆叠。
- 默认值：参数依赖于实例的规格，实例规格不同对应其默认值也不同。
- 修改建议：无
 
#### 与内核规则有关的参数
如下参数的输入会根据内核规则对取值进行对应的调整。调整的规则如下所示：
- key_cache_age_threshold会自动调整为100的倍数。
- join_buffer_size和key_cache_block_size会自动调整为128的倍数。
- query_cache_size、query_prealloc_size、innodb_log_buffer_size和max_allowed_packet 、thread_stack 会自动调整为1024的倍数。
- read_buffer_size、read_rnd_buffer_size、binlog_cache_size 、binlog_stmt_cache_size 会自动调整为4096的倍数。
- data_buffer_size、log_buffer_size、shared_pool_size、temp_buffer_size 会自动调整为1048576的倍数。
 
