外观
MySQL 核心参数列表
连接与线程参数
max_connections
- 默认值:151
- 推荐值:根据服务器资源和业务需求调整,一般 500-2000
- 作用:限制 MySQL 服务器允许的最大并发连接数
- 注意事项:
- 过高的值可能导致内存耗尽
- 建议根据
max_connections * (sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size)估算内存使用 - MySQL 8.0 支持动态调整
max_user_connections
- 默认值:0(无限制)
- 推荐值:根据用户需求设置,如 100-500
- 作用:限制单个用户的最大并发连接数
- 注意事项:
- 0 表示无限制
- 用于防止单个用户占用过多连接资源
thread_cache_size
- 默认值:
- MySQL 5.7:64
- MySQL 8.0:64(自动调整)
- 推荐值:50-200
- 作用:缓存线程数,减少线程创建和销毁的开销
- 注意事项:
- 对于高并发场景,适当增大该值
- MySQL 8.0 会自动调整,可设置为 0 让系统自动管理
thread_stack
- 默认值:
- Linux:256KB
- Windows:256KB
- 推荐值:默认值即可,一般无需调整
- 作用:每个线程的堆栈大小
- 注意事项:
- 过大的值会导致内存使用增加
- 过小的值可能导致线程栈溢出
wait_timeout
- 默认值:28800(8小时)
- 推荐值:600-3600(10分钟-1小时)
- 作用:服务器关闭非活动连接之前等待的秒数
- 注意事项:
- 过小的值可能导致频繁的连接断开和重建
- 过大的值可能导致连接资源占用过多
interactive_timeout
- 默认值:28800(8小时)
- 推荐值:600-3600(10分钟-1小时)
- 作用:服务器关闭交互式连接之前等待的秒数
- 注意事项:
- 交互式连接指使用 mysql 客户端等交互式工具建立的连接
- 建议与 wait_timeout 设置相同的值
内存参数
innodb_buffer_pool_size
- 默认值:
- MySQL 5.7:128MB
- MySQL 8.0:自动设置为物理内存的 50%
- 推荐值:物理内存的 50%-80%
- 作用:InnoDB 缓冲池大小,用于缓存数据和索引
- 注意事项:
- 最重要的性能参数之一
- 建议设置为物理内存的 50%-80%
- 对于 dedicated MySQL 服务器,可设置为物理内存的 70%-80%
- MySQL 8.0 支持动态调整
innodb_buffer_pool_instances
- 默认值:
- MySQL 5.7:根据 innodb_buffer_pool_size 自动设置
- MySQL 8.0:根据 innodb_buffer_pool_size 自动设置
- 推荐值:
- 对于 innodb_buffer_pool_size < 8GB:1
- 对于 innodb_buffer_pool_size >= 8GB:4-8
- 作用:InnoDB 缓冲池实例数量
- 注意事项:
- 每个实例有自己的锁和管理结构
- 过多的实例会增加内存开销和锁竞争
- 建议每个实例大小不小于 1GB
key_buffer_size
- 默认值:
- MySQL 5.7:8MB
- MySQL 8.0:8MB
- 推荐值:
- 对于 MyISAM 表:物理内存的 10%-20%
- 对于 InnoDB 表:16MB-64MB
- 作用:MyISAM 索引缓冲区大小
- 注意事项:
- 主要用于 MyISAM 表的索引缓存
- 对于主要使用 InnoDB 的系统,该值不需要太大
sort_buffer_size
- 默认值:256KB
- 推荐值:256KB-2MB
- 作用:每个会话的排序缓冲区大小
- 注意事项:
- 每个连接都会分配该大小的缓冲区
- 过大的值会导致内存使用激增
- 建议设置为适中值,如 256KB-2MB
read_buffer_size
- 默认值:128KB
- 推荐值:128KB-1MB
- 作用:每个会话的顺序读取缓冲区大小
- 注意事项:
- 用于 MyISAM 表的顺序扫描
- 每个连接都会分配该大小的缓冲区
- 过大的值会导致内存使用激增
read_rnd_buffer_size
- 默认值:256KB
- 推荐值:256KB-4MB
- 作用:每个会话的随机读取缓冲区大小
- 注意事项:
- 用于 MyISAM 表的随机读取
- 每个连接都会分配该大小的缓冲区
- 过大的值会导致内存使用激增
join_buffer_size
- 默认值:256KB
- 推荐值:256KB-4MB
- 作用:每个会话的连接缓冲区大小
- 注意事项:
- 用于表连接操作
- 每个连接都会分配该大小的缓冲区
- 过大的值会导致内存使用激增
InnoDB 存储引擎参数
innodb_data_file_path
- 默认值:ibdata1:12M:autoextend
- 推荐值:根据实际需求设置,如 ibdata1:512M:autoextend
- 作用:InnoDB 数据文件路径和大小
- 注意事项:
- 第一个数据文件必须大于等于 12MB
- autoextend 表示自动扩展
- 建议将 ibdata1 设置为固定大小,避免频繁扩展
innodb_file_per_table
- 默认值:
- MySQL 5.6 及以上:ON
- MySQL 5.5 及以下:OFF
- 推荐值:ON
- 作用:是否为每个 InnoDB 表创建独立的数据文件
- 注意事项:
- ON 表示每个表的数据和索引存储在单独的 .ibd 文件中
- 便于表空间管理和清理
- 建议开启
innodb_log_file_size
- 默认值:
- MySQL 5.7:48MB
- MySQL 8.0:50331648(约 48MB)
- 推荐值:256MB-4GB
- 作用:InnoDB 重做日志文件大小
- 注意事项:
- 较大的日志文件可以减少 checkpoint 频率,提高性能
- 但会增加崩溃恢复时间
- 建议设置为 256MB-4GB
- 多个日志文件的总大小不应超过 innodb_buffer_pool_size 的 1/2
innodb_log_files_in_group
- 默认值:2
- 推荐值:2-4
- 作用:InnoDB 重做日志文件组中的文件数量
- 注意事项:
- 默认为 2 个文件
- 建议保持默认值或设置为 4
innodb_log_buffer_size
- 默认值:
- MySQL 5.7:16MB
- MySQL 8.0:16777216(16MB)
- 推荐值:16MB-128MB
- 作用:InnoDB 日志缓冲区大小
- 注意事项:
- 用于缓存重做日志,减少磁盘 I/O
- 对于写入密集型应用,可适当增大
innodb_flush_log_at_trx_commit
- 默认值:1
- 推荐值:
- 生产环境:1
- 测试环境:0 或 2
- 作用:控制事务提交时重做日志的刷新策略
- 注意事项:
- 1:每次事务提交都刷新到磁盘,最安全但性能最差
- 2:每次事务提交都写入操作系统缓存,每秒刷新到磁盘
- 0:每秒将日志缓冲区写入磁盘并刷新,性能最好但最不安全
innodb_flush_method
- 默认值:
- Linux:fsync
- Windows:unbuffered
- 推荐值:O_DIRECT
- 作用:InnoDB 数据和日志文件的刷新方法
- 注意事项:
- O_DIRECT:绕过操作系统缓存,直接写入磁盘,适合使用 RAID 控制器的场景
- O_DSYNC:使用 O_DSYNC 方式刷新
- fsync:使用 fsync() 函数刷新
innodb_lock_wait_timeout
- 默认值:50
- 推荐值:50-300
- 作用:InnoDB 事务等待行锁的超时时间(秒)
- 注意事项:
- 超过该时间未获取锁的事务会被回滚
- 对于长时间运行的事务,可适当增大
innodb_deadlock_detect
- 默认值:ON
- 推荐值:ON
- 作用:是否启用死锁检测
- 注意事项:
- 对于高并发系统,死锁检测可能带来性能开销
- 但禁用死锁检测可能导致事务长时间等待
- 建议保持启用
性能相关参数
query_cache_type
- 默认值:
- MySQL 5.7:OFF
- MySQL 8.0:已移除
- 推荐值:OFF
- 作用:查询缓存类型
- 注意事项:
- 0/OFF:禁用查询缓存
- 1/ON:启用查询缓存,缓存所有查询
- 2/DEMAND:仅缓存带有 SQL_CACHE 提示的查询
- MySQL 8.0 已移除查询缓存功能
query_cache_size
- 默认值:
- MySQL 5.7:1MB
- MySQL 8.0:已移除
- 推荐值:0
- 作用:查询缓存大小
- 注意事项:
- 仅在 query_cache_type 为 ON 或 DEMAND 时有效
- MySQL 8.0 已移除查询缓存功能
slow_query_log
- 默认值:OFF
- 推荐值:ON
- 作用:是否启用慢查询日志
- 注意事项:
- 用于记录执行时间超过 long_query_time 的查询
- 建议在生产环境启用
long_query_time
- 默认值:10
- 推荐值:0.5-2
- 作用:慢查询的阈值(秒)
- 注意事项:
- 执行时间超过该值的查询会被记录到慢查询日志
- 建议设置为 0.5-2 秒
log_queries_not_using_indexes
- 默认值:OFF
- 推荐值:OFF(生产环境),ON(测试环境)
- 作用:是否记录未使用索引的查询
- 注意事项:
- 启用后会记录所有未使用索引的查询
- 生产环境可能会产生大量日志,建议禁用
max_allowed_packet
- 默认值:
- MySQL 5.7:4MB
- MySQL 8.0:67108864(64MB)
- 推荐值:64MB-256MB
- 作用:允许的最大数据包大小
- 注意事项:
- 用于限制客户端和服务器之间传输的数据包大小
- 对于大对象或大量数据传输,需要增大该值
tmp_table_size
- 默认值:16MB
- 推荐值:64MB-256MB
- 作用:内存临时表的最大大小
- 注意事项:
- 超过该大小的临时表会转换为磁盘临时表
- 与 max_heap_table_size 取较小值
max_heap_table_size
- 默认值:16MB
- 推荐值:64MB-256MB
- 作用:内存表的最大大小
- 注意事项:
- 超过该大小的内存表无法插入数据
- 与 tmp_table_size 取较小值
复制相关参数
server_id
- 默认值:1
- 推荐值:唯一的服务器 ID
- 作用:标识复制拓扑中的服务器
- 注意事项:
- 复制拓扑中的每个服务器必须有唯一的 server_id
- 建议使用 IP 地址的最后一段或其他唯一标识
log_bin
- 默认值:OFF
- 推荐值:ON
- 作用:是否启用二进制日志
- 注意事项:
- 用于复制和数据恢复
- 主库必须启用
- 建议在从库也启用,便于故障切换
binlog_format
- 默认值:
- MySQL 5.7:ROW
- MySQL 8.0:ROW
- 推荐值:ROW
- 作用:二进制日志格式
- 注意事项:
- STATEMENT:记录 SQL 语句
- ROW:记录行级变更
- MIXED:混合模式
- 建议使用 ROW 格式,提供最安全的复制
binlog_row_image
- 默认值:FULL
- 推荐值:FULL
- 作用:行格式二进制日志中记录的行数据量
- 注意事项:
- FULL:记录完整的行数据
- MINIMAL:仅记录变更的列
- NOBLOB:记录完整行数据,但不包括 BLOB 和 TEXT 列
- 建议使用 FULL,确保复制安全
sync_binlog
- 默认值:1
- 推荐值:
- 生产环境:1
- 测试环境:0
- 作用:控制二进制日志的刷新策略
- 注意事项:
- 1:每次事务提交都刷新二进制日志到磁盘
- 0:由操作系统决定何时刷新
- N:每 N 个事务刷新一次
- 建议设置为 1,确保二进制日志的安全性
relay_log
- 默认值:主机名-relay-bin
- 推荐值:根据实际需求设置,如 relay-bin
- 作用:从库中继日志文件名
- 注意事项:
- 从库用于存储从主库接收的二进制日志
relay_log_recovery
- 默认值:
- MySQL 5.7:ON
- MySQL 8.0:ON
- 推荐值:ON
- 作用:是否启用中继日志自动恢复
- 注意事项:
- 启用后,从库启动时会自动恢复损坏的中继日志
- 建议开启
安全相关参数
skip_name_resolve
- 默认值:OFF
- 推荐值:ON
- 作用:是否跳过域名解析
- 注意事项:
- ON 表示不进行域名解析,只使用 IP 地址
- 可以提高连接建立速度,避免 DNS 解析问题
- 但需要在授权表中使用 IP 地址而非主机名
local_infile
- 默认值:ON
- 推荐值:OFF
- 作用:是否允许使用 LOAD DATA LOCAL INFILE 语句
- 注意事项:
- 禁用可以提高安全性,防止未经授权的文件访问
- 如需使用,建议仅在特定用户或场景下启用
secure_file_priv
- 默认值:
- MySQL 5.7 及以上:NULL(禁用)
- MySQL 5.6 及以下:空(允许任意目录)
- 推荐值:指定特定目录,如 /var/lib/mysql-files/
- 作用:限制 LOAD DATA 和 SELECT ... INTO OUTFILE 语句的文件操作目录
- 注意事项:
- NULL 表示禁用相关操作
- 空字符串表示允许任意目录(不安全)
- 建议指定特定目录
sql_mode
- 默认值:
- MySQL 5.7:STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- MySQL 8.0:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
- 推荐值:根据实际需求调整,建议启用严格模式
- 作用:设置 SQL 模式,控制 MySQL 的 SQL 语法和数据验证
- 注意事项:
- 严格模式可以提高数据完整性
- 建议启用严格模式和 ONLY_FULL_GROUP_BY 等选项
其他重要参数
character_set_server
- 默认值:
- MySQL 5.7:latin1
- MySQL 8.0:utf8mb4
- 推荐值:utf8mb4
- 作用:服务器默认字符集
- 注意事项:
- utf8mb4 支持完整的 UTF-8 字符集,包括 emoji
- 建议使用 utf8mb4
collation_server
- 默认值:
- MySQL 5.7:latin1_swedish_ci
- MySQL 8.0:utf8mb4_0900_ai_ci
- 推荐值:utf8mb4_0900_ai_ci 或 utf8mb4_unicode_ci
- 作用:服务器默认排序规则
- 注意事项:
- 与 character_set_server 对应
- utf8mb4_0900_ai_ci 是 MySQL 8.0 的默认值,性能较好
- utf8mb4_unicode_ci 兼容性更好
max_connect_errors
- 默认值:100
- 推荐值:1000-10000
- 作用:允许的最大连接错误数
- 注意事项:
- 超过该值的主机将被禁止连接
- 可以使用 FLUSH HOSTS 命令解除禁止
back_log
- 默认值:
- MySQL 5.7:80
- MySQL 8.0:151
- 推荐值:128-512
- 作用:MySQL 监听队列的最大长度
- 注意事项:
- 用于处理连接请求的队列
- 对于高并发系统,可适当增大
table_open_cache
- 默认值:
- MySQL 5.7:2000
- MySQL 8.0:4000
- 推荐值:2000-10000
- 作用:表缓存大小
- 注意事项:
- 用于缓存打开的表描述符
- 对于有大量表的系统,可适当增大
table_definition_cache
- 默认值:
- MySQL 5.7:1400
- MySQL 8.0:2000
- 推荐值:1000-5000
- 作用:表定义缓存大小
- 注意事项:
- 用于缓存表定义
- 对于有大量表的系统,可适当增大
常见问题(FAQ)
Q1: 如何调整 MySQL 参数?
A1: 调整 MySQL 参数的方法有两种:
- 临时调整:使用
SET GLOBAL parameter_name = value;命令,重启后失效 - 永久调整:在 my.cnf 或 my.ini 配置文件中修改,重启后生效
Q2: 如何查看当前 MySQL 参数值?
A2: 查看当前 MySQL 参数值的方法:
- 使用
SHOW VARIABLES LIKE 'parameter_name';查看单个参数 - 使用
SHOW GLOBAL VARIABLES;查看所有全局参数 - 使用
SHOW SESSION VARIABLES;查看当前会话参数
Q3: 如何确定合适的参数值?
A3: 确定合适的参数值需要考虑以下因素:
- 服务器硬件配置(CPU、内存、磁盘)
- 业务场景(OLTP、OLAP、混合负载)
- 数据量大小
- 并发连接数
- MySQL 版本
Q4: 哪些参数对性能影响最大?
A4: 对性能影响最大的参数包括:
- innodb_buffer_pool_size
- innodb_log_file_size
- innodb_log_buffer_size
- innodb_flush_log_at_trx_commit
- max_connections
- sort_buffer_size
- read_buffer_size
- join_buffer_size
Q5: 如何监控参数调整的效果?
A5: 监控参数调整效果的方法:
- 使用 SHOW GLOBAL STATUS 查看状态变量
- 使用 Performance Schema 和 Sys Schema 进行性能分析
- 使用监控工具(如 Prometheus + Grafana、Zabbix)进行实时监控
- 进行基准测试,比较调整前后的性能差异
Q6: MySQL 8.0 有哪些参数变化?
A6: MySQL 8.0 的参数变化包括:
- 移除了查询缓存相关参数(query_cache_type、query_cache_size 等)
- 默认字符集改为 utf8mb4
- 增强了 innodb_directories 参数
- 新增了 innodb_dedicated_server 参数,自动调整 InnoDB 相关参数
- 调整了一些参数的默认值
Q7: 如何备份和恢复 MySQL 配置?
A7: 备份和恢复 MySQL 配置的方法:
- 备份:复制 my.cnf 或 my.ini 配置文件
- 恢复:将备份的配置文件复制到相应位置,重启 MySQL 服务
Q8: 如何处理参数配置错误?
A8: 处理参数配置错误的方法:
- 查看 MySQL 错误日志,找出具体的错误参数
- 修正配置文件中的错误参数
- 重启 MySQL 服务
- 如果无法启动,可使用 --skip-grant-tables 选项启动,修改配置后重启
Q9: 哪些参数支持动态调整?
A9: 支持动态调整的参数包括:
- innodb_buffer_pool_size(MySQL 5.7 及以上)
- max_connections
- wait_timeout
- interactive_timeout
- innodb_log_buffer_size
- innodb_flush_log_at_trx_commit
- slow_query_log
- long_query_time
Q10: 如何优化内存使用?
A10: 优化 MySQL 内存使用的方法:
- 合理设置 innodb_buffer_pool_size,避免过大导致系统内存不足
- 调整 sort_buffer_size、read_buffer_size 等会话级参数,避免每个连接占用过多内存
- 监控内存使用情况,及时调整参数
- 考虑使用大页内存(HugePages)提高内存使用效率
Q11: 如何优化 InnoDB 性能?
A11: 优化 InnoDB 性能的方法:
- 合理设置 innodb_buffer_pool_size
- 调整 innodb_log_file_size 和 innodb_log_files_in_group
- 优化 innodb_flush_log_at_trx_commit 和 innodb_flush_method
- 启用 innodb_file_per_table
- 调整 innodb_buffer_pool_instances
Q12: 如何优化复制性能?
A12: 优化 MySQL 复制性能的方法:
- 使用 ROW 格式的二进制日志
- 调整 innodb_flush_log_at_trx_commit 和 sync_binlog
- 启用从库并行复制
- 优化网络连接
- 确保从库硬件配置与主库匹配
