乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

my.cnf 核心参数

导学

MySQL 安装后带着一套默认值运行,但生产环境必须根据硬件规格和业务特点调整配置。my.cnf(Linux)或 my.ini(Windows)是 MySQL 的"中枢神经"——它决定服务器用多少内存、允许多少连接、事务如何刷盘。本节聚焦最影响性能和稳定性的核心参数。

配置文件位置与加载顺序

MySQL 5.7 按以下顺序读取配置,后读取的文件覆盖先读取的同名参数:

查看当前服务器实际使用的配置值:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';

场景一:内存相关核心参数

innodb_buffer_pool_size

InnoDB 存储引擎的缓冲池,用于缓存表数据和索引。这是 MySQL 5.7 中最重要的性能参数。

[mysqld]
# 服务器内存 8GB 时,建议设为 4GB~6GB(物理内存的 50%~75%)
innodb_buffer_pool_size = 4G

# 如果缓冲池超过 1GB,建议分成多个实例减少锁竞争
innodb_buffer_pool_instances = 4

验证当前设置:

SELECT @@innodb_buffer_pool_size / 1024 / 1024 / 1024 AS size_gb;
size_gb
4.0000

结果解读:缓冲池越大,热点数据越可能留在内存中,磁盘 I/O 越少。但超过物理内存的 75% 可能导致操作系统换页,反而降低性能。

查看缓冲池命中率

SHOW STATUS LIKE 'Innodb_buffer_pool_read%';
Variable_nameValue
Innodb_buffer_pool_reads1234
Innodb_buffer_pool_read_requests9876543

命中率 = 1 - (reads / read_requests)。生产环境应保持在99% 以上。

场景二:连接与线程相关参数

max_connections

允许同时连接的最大客户端数。默认 151,高并发场景需调大。

[mysqld]
max_connections = 500

验证:

SELECT @@max_connections;
@@max_connections
500

注意:连接数不是越大越好。每个连接消耗内存(thread_cache_size、sort_buffer_size 等累加),500 个连接可能吃掉数 GB 内存。应配合应用层连接池使用。

wait_timeout 与 interactive_timeout

空闲连接自动断开时间(秒),防止应用层连接泄漏撑爆服务器。

[mysqld]
wait_timeout = 600
interactive_timeout = 600

验证当前空闲连接:

SHOW PROCESSLIST;

关注 Command = Sleep 且 Time 很大的连接——如果它们长期不活跃,可能是连接池配置不当或应用未正确关闭连接。

场景三:事务与日志相关参数

innodb_flush_log_at_trx_commit

控制事务日志(redo log)的刷盘策略,直接影响数据安全与性能的平衡。

[mysqld]
# 0:每秒刷盘一次(性能最好,崩溃可能丢1秒数据)
# 1:每次事务提交都刷盘(最安全,默认,性能最差)
# 2:每次事务提交写入 OS 缓存,每秒刷盘(折中)
innodb_flush_log_at_trx_commit = 1
取值安全性性能适用场景
0低最高非核心日志库,可容忍秒级丢失
1最高低金融、订单等核心交易(默认)
2中中一般业务,配合 UPS 和 RAID 缓存使用

验证:

SELECT @@innodb_flush_log_at_trx_commit;

innodb_log_file_size

单个 redo log 文件的大小。默认 48MB,大事务场景需调大。

[mysqld]
innodb_log_file_size = 256M
innodb_log_files_in_group = 2

注意:修改此参数前必须干净关闭 MySQL,删除旧的 ib_logfile0、ib_logfile1,再启动。否则服务器拒绝启动。

场景四:字符集与排序规则

MySQL 5.7 默认字符集是 latin1,现代应用必须显式改为 utf8mb4。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 客户端连接时也使用 utf8mb4
init_connect = 'SET NAMES utf8mb4'

验证:

SHOW VARIABLES LIKE 'character_set%';
Variable_nameValue
character_set_serverutf8mb4
character_set_databaseutf8mb4
character_set_clientutf8mb4
character_set_connectionutf8mb4

场景五:慢查询日志(调优必备)

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

验证:

SHOW VARIABLES LIKE 'slow_query%';
Variable_nameValue
slow_query_logON
slow_query_log_file/var/lib/mysql/slow.log
long_query_time2.000000

结果解读:执行时间超过 2 秒的 SQL 会被记录到慢查询日志中;未使用索引的查询也会被记录(即使执行很快)。这是性能调优的首要信息来源。

常见误区

误区正解
"max_connections 越大越好"不是。每个连接消耗内存,过大导致 OOM。应配合应用层连接池,通常 200~1000 足够。
"innodb_buffer_pool_size 可以设为物理内存的 90%"不建议。操作系统和其他进程也需要内存,建议 50%~75%。
"修改 my.cnf 后重启立即生效"大部分参数需要重启;少数可用 SET GLOBAL 动态修改(如 max_connections),但重启后丢失。
"innodb_flush_log_at_trx_commit = 0 不会丢数据"会。崩溃时可能丢失最近 1 秒的数据。核心交易必须用 = 1。

面试考点

Q:innodb_buffer_pool_size 怎么设?

设为物理内存的 50%~75%。超过 1GB 时配合 innodb_buffer_pool_instances(通常每 1GB 一个实例)减少锁竞争。通过 SHOW STATUS LIKE 'Innodb_buffer_pool_read%' 计算命中率,应 > 99%。

Q:innodb_flush_log_at_trx_commit 三个取值的区别?

0:每秒刷盘,性能最好但可能丢 1 秒数据;1:每次事务提交刷盘,最安全(默认);2:每次提交写 OS 缓存,每秒刷盘,折中方案。金融交易用 1,日志/统计库可用 0 或 2。

Q:修改 innodb_log_file_size 要注意什么?

必须干净关闭 MySQL,删除数据目录下的 ib_logfile0、ib_logfile1,再启动。MySQL 会自动重建新大小的日志文件。直接修改会导致启动失败。

小结

  • innodb_buffer_pool_size 是最重要的性能参数,建议物理内存的 50%~75%
  • max_connections 配合应用层连接池使用,不是越大越好
  • innodb_flush_log_at_trx_commit 决定事务安全级别,核心交易必须用 1
  • 字符集务必设为 utf8mb4,避免中文乱码
  • 慢查询日志是性能调优的入口,生产环境必须开启

下一章引子:配置调优让 MySQL 跑得更稳更快,但表结构设计是否合理,决定了数据是否冗余、更新是否异常——这就是数据库范式的意义。

上一页
FLUSH 与 RESET 语句
下一页
字符集与排序规则