常规配置
MySQL服务基本配置,包括端口、数据目录、字符集等
MySQL服务监听端口
说明
MySQL服务监听的TCP端口。可以更改为其他端口以避免冲突或增强安全性。
配置示例
# 默认端口
port = 3306
# 自定义端口
port = 3307
MySQL数据文件存储目录
说明
指定MySQL数据文件的存储位置,包括数据库、表、索引等。生产环境建议使用高性能存储(如SSD)并确保有足够的磁盘空间。
重要: 修改此参数需要迁移现有数据,操作前请备份!
配置示例
# Linux默认路径
datadir = /var/lib/mysql
# Windows默认路径
datadir = C:/ProgramData/MySQL/MySQL Server 8.0/Data
# 自定义路径(使用SSD)
datadir = /ssd/mysql/data
服务器默认字符集
说明
设置服务器的默认字符集。对于中文环境,强烈建议设置为utf8mb4以支持完整的Unicode字符(包括emoji)。
推荐: 所有新项目应使用utf8mb4字符集。
常用字符集
| 字符集 | 说明 | 推荐场景 |
|---|---|---|
utf8mb4 |
完整的UTF-8编码,支持所有Unicode字符 | 推荐,现代应用 |
utf8 |
MySQL的"utf8"只支持3字节,不是完整的UTF-8 | 不推荐,有缺陷 |
latin1 |
西欧字符集,不支持中文 | 不推荐中文环境 |
gbk |
简体中文字符集 | 旧系统兼容 |
配置示例
# 推荐:使用utf8mb4字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 旧系统兼容配置
character-set-server = utf8
collation-server = utf8_general_ci
最大客户端连接数
说明
设置MySQL服务器允许的最大并发连接数。需要根据服务器内存和应用需求进行调整。每个连接会占用一定内存(约256KB-几MB)。
计算: 连接数 × 每个连接内存 ≈ 总连接内存占用
配置示例
# 默认值
max_connections = 151
# 小型应用
max_connections = 300
# 大型应用
max_connections = 1000
# 监控当前连接数
SHOW STATUS LIKE 'Threads_connected';
假设每个连接占用300KB内存
内存配置
MySQL内存分配和缓存配置
InnoDB缓冲池大小
说明
InnoDB缓冲池是InnoDB存储引擎的核心内存区域,用于缓存数据和索引。设置合理的缓冲池大小对性能有极大影响。通常设置为系统内存的50-80%。
最重要: 这是MySQL性能调优中最重要的参数!
配置示例
# 系统内存为8GB时,设置为6GB
innodb_buffer_pool_size = 6G
# 系统内存为16GB时,设置为12GB
innodb_buffer_pool_size = 12G
# 动态调整(MySQL 5.7+)
innodb_buffer_pool_size = 4G
innodb_buffer_pool_chunk_size = 128M
innodb_buffer_pool_instances = 4
内存分配建议
| 系统内存 | 推荐值 | 百分比 | 说明 |
|---|---|---|---|
| 2GB | 1GB | 50% | 小内存服务器 |
| 8GB | 6GB | 75% | 中等服务器 |
| 16GB | 12GB | 75% | 生产服务器 |
| 32GB | 24GB | 75% | 大型数据库 |
| 64GB+ | 48GB+ | 75% | 高端服务器 |
MyISAM索引缓冲区大小
说明
MyISAM存储引擎的索引缓冲区大小。如果主要使用InnoDB引擎,此参数可以设置较小值。如果使用MyISAM表,建议设置为可用内存的25%。
注意: MyISAM已过时,新项目应使用InnoDB引擎。
配置示例
# 纯InnoDB环境,设置较小值
key_buffer_size = 16M
# MyISAM环境,系统内存8GB时
key_buffer_size = 2G
查询缓存大小
说明
MySQL查询缓存存储SELECT查询结果。在MySQL 8.0中已移除。对于MySQL 5.7及以下版本,在写多读少的场景中,查询缓存可能降低性能。
MySQL 8.0: 查询缓存功能已完全移除!
配置示例
# MySQL 5.7:禁用查询缓存
query_cache_type = 0
query_cache_size = 0
# MySQL 5.7:启用查询缓存(256MB)
query_cache_type = 1
query_cache_size = 256M
InnoDB配置
InnoDB存储引擎核心配置
InnoDB优势
- 支持ACID事务
- 行级锁,高并发
- 外键约束支持
- 崩溃恢复能力
默认存储引擎
从MySQL 5.5开始,InnoDB成为默认存储引擎
InnoDB重做日志文件大小
说明
每个InnoDB重做日志文件的大小。较大的日志文件可以减少checkpoint频率,提高写性能,但会增加崩溃恢复时间。通常设置为缓冲池大小的25%左右。
配置示例
# 缓冲池为6GB时,设置日志文件为1.5GB
innodb_log_file_size = 1536M
# 缓冲池为12GB时,设置日志文件为3GB
innodb_log_file_size = 3G
事务提交时日志刷新策略
说明
控制事务提交时InnoDB日志刷新到磁盘的方式,影响性能和数据安全性。
参数值说明
| 值 | 说明 | 性能 | 数据安全 | 适用场景 |
|---|---|---|---|---|
0 |
每秒写入并刷新日志到磁盘 | 最高 | 最低 | 可容忍数据丢失 |
1 |
每次事务提交都写入并刷新(默认) | 最低 | 最高 | 金融交易等 |
2 |
每次事务提交都写入,每秒刷新 | 中等 | 中等 | 推荐,平衡 |
配置示例
# 默认:最高数据安全,较低性能
innodb_flush_log_at_trx_commit = 1
# 推荐:平衡性能和数据安全
innodb_flush_log_at_trx_commit = 2
# 高性能:可容忍少量数据丢失
innodb_flush_log_at_trx_commit = 0
是否为每个InnoDB表创建单独的表空间文件
说明
控制InnoDB表是使用共享表空间还是独立表空间文件。强烈建议启用,便于管理和维护。
推荐: 始终启用此选项,便于表管理、备份和恢复。
配置示例
# 推荐:每个表使用独立文件
innodb_file_per_table = ON
# 不推荐:所有表共享表空间
innodb_file_per_table = OFF
性能调优
优化MySQL性能的关键参数
性能指标
调优建议
- 合理设置innodb_buffer_pool_size
- 使用连接池减少连接开销
- 优化查询语句和索引
- 定期分析慢查询日志
排序缓冲区大小
说明
每个需要进行排序的线程分配的缓冲区大小。如果有很多复杂排序操作,可以适当增加此值。但设置过大会导致内存浪费。
配置示例
# 默认值
sort_buffer_size = 256K
# 有大量排序操作时
sort_buffer_size = 2M
# 查看排序状态
SHOW STATUS LIKE 'Sort%';
顺序读取缓冲区大小
说明
MyISAM表顺序扫描时分配的缓冲区大小。对于InnoDB表影响较小。如果有很多顺序扫描操作,可以适当增加。
配置示例
# 默认值
read_buffer_size = 128K
# 有大量顺序扫描时
read_buffer_size = 1M
配置示例
完整的MySQL配置文件示例
生产环境配置示例 (8GB内存)
适用于高并发、高可用的生产环境
[mysqld]
# 常规配置
port = 3306
bind-address = 0.0.0.0
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 连接配置
max_connections = 500
max_connect_errors = 1000
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800
# 内存配置 (8GB系统内存)
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 4
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
key_buffer_size = 32M
query_cache_size = 0
query_cache_type = 0
# InnoDB配置
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 50
# 性能调优
sort_buffer_size = 2M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
join_buffer_size = 2M
tmp_table_size = 64M
max_heap_table_size = 64M
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_error = /var/log/mysql/error.log
# 安全配置
skip-name-resolve
# 注意:requirepass在my.cnf中使用时要注意安全,建议通过其他方式设置密码
[mysqld_safe]
log-error = /var/log/mysql/error.log
pid-file = /var/run/mysqld/mysqld.pid
配置说明
- 针对8GB内存服务器优化
- 使用utf8mb4字符集,支持完整Unicode
- 设置500个最大连接数
- InnoDB缓冲池设置为6GB(系统内存的75%)
- 禁用查询缓存(MySQL 5.7)
- 平衡性能和数据安全(innodb_flush_log_at_trx_commit=2)
- 启用慢查询日志,便于性能分析
开发环境配置示例 (4GB内存)
适用于本地开发和测试环境
[mysqld]
# 常规配置
port = 3306
bind-address = 127.0.0.1
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 连接配置
max_connections = 200
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800
# 内存配置 (4GB系统内存)
innodb_buffer_pool_size = 2G
key_buffer_size = 16M
query_cache_size = 0
query_cache_type = 0
# InnoDB配置
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
# 性能调优
sort_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
join_buffer_size = 256K
# 日志配置
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 5
# 其他配置
skip-external-locking
skip-name-resolve
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
配置说明
- 针对4GB内存开发机优化
- 仅绑定到localhost,安全性足够
- 使用utf8mb4字符集
- 设置200个最大连接数
- InnoDB缓冲池设置为2GB(系统内存的50%)
- 禁用查询缓存
- 启用慢查询日志,阈值5秒
- 简化配置,便于开发调试