一、数据库设计阶段优化

1. 规范化设计(前期)

2. 数据类型选择

3. 主键设计


二、索引优化

1. 索引类型

2. 建立索引建议

3. 索引失效情况

4.避免死锁和锁等待


三、SQL 编写与优化

1. 查询优化

2. JOIN 优化

3. 子查询与临时表


四、慢查询分析与调优

1. 开启慢查询日志

slow_query_log = 1
long_query_time = 1 # 设置为超过1秒的查询记录到日志
log_queries_not_using_indexes = 1

2. 分析工具

3. 重点关注指标


五、表结构与数据优化

1. 分区与分表(大表处理)

2. 数据归档与冷热分离

3. 表统计信息更新


六、事务与锁优化

1. 事务控制

2. 锁优化


七、服务器与参数优化

1. 调整 InnoDB Buffer Pool

2. 查询缓存(Query Cache)

3. 线程池优化

4. 磁盘 I/O 优化

5. 调整日志文件大小

6. 调整连接超时

八、监控与告警

1. 常用监控项

2. 工具推荐

九、分布式与高可用架构优化

1. 主从复制

2. 高可用方案

3. 分库分表中间件

十、调优流程总结图(建议保存)

[系统设计] -> [表结构设计] -> [SQL 编写规范] -> [索引优化] -> [慢SQL分析]
                                ↓
                     [执行计划分析 (EXPLAIN)]
                                ↓
                   [SQL重写 / 索引调整 / 表结构调整]
                                ↓
         [事务控制] + [锁优化] + [数据归档] + [参数调优]
                                ↓
                         [持续监控与告警]

配置文件详解

配置文件结构

MySQL 配置文件由多个部分组成,每个部分以方括号 [section_name] 开头,指定该部分适用于哪个程序或工具。常见的部分包括:


常用参数详解

以下是各部分中常用参数的说明:

[client][mysql] 部分

[mysqld] 部分(服务器配置)

基本设置

连接管理

字符集设置

日志设置

缓冲区和缓存设置

InnoDB 存储引擎设置

二进制日志和复制设置

安全性设置


配置示例

以下是一个典型的 my.cnf 配置文件示例:

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set = utf8mb4

[mysqld]
user = mysql
port = 3306
socket = /var/lib/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /var/lib/mysql
tmpdir = /tmp
skip-name-resolve

max_connections = 500
max_connect_errors = 1000
wait_timeout = 600
interactive_timeout = 600

character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'

log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

key_buffer_size = 64M
query_cache_size = 0
tmp_table_size = 64M
max_heap_table_size = 64M

innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT

server-id = 1
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7

skip-networking = 0
secure-file-priv = /var/lib/mysql-files
[client]
# 客户端连接配置
port = 3306                         # 默认连接端口
socket = /var/lib/mysql/mysql.sock # 与服务器通信的套接字文件路径

[mysqld]
# ========================
# 基础参数
# ========================
port = 3306                          # 服务器监听端口
user = mysql                         # 运行 MySQL 的系统用户
basedir = /usr/local/mysql           # MySQL 安装路径(按实际路径设置)
datadir = /var/lib/mysql             # 数据文件目录
socket = /var/lib/mysql/mysql.sock   # 套接字文件路径
pid-file = /var/run/mysqld/mysqld.pid # PID 文件路径

# ========================
# 网络连接相关
# ========================
bind-address = 0.0.0.0               # 监听所有 IP 地址
max_connections = 1000               # 最大并发连接数
max_connect_errors = 10000           # 单个 IP 的连接错误上限(防止暴力攻击)
wait_timeout = 300                   # 空闲连接等待超时(单位秒)
interactive_timeout = 300            # 交互式连接超时(单位秒)
skip-name-resolve                    # 禁用 DNS 解析,加快连接速度(需使用 IP 授权)

# ========================
# 字符集设置
# ========================
character-set-server = utf8mb4       # 默认字符集(推荐 UTF-8)
collation-server = utf8mb4_general_ci# 字符集排序规则
init_connect = 'SET NAMES utf8mb4'   # 客户端连接初始化字符集

# ========================
# 错误日志与慢查询日志
# ========================
log-error = /var/log/mysql/mysql-error.log   # 错误日志文件路径
slow_query_log = 1                            # 开启慢查询日志
slow_query_log_file = /var/log/mysql/mysql-slow.log # 慢查询日志路径
long_query_time = 1                           # 查询超过 1 秒记录为慢查询
log_queries_not_using_indexes = 0            # 是否记录未用索引的查询(优化期可开启)

# ========================
# 缓存与临时表
# ========================
query_cache_size = 0                 # 查询缓存大小(已废弃建议为0)
query_cache_type = 0
table_open_cache = 4096             # 表缓存大小(提高频繁访问的表命中率)
table_definition_cache = 4096       # 表定义缓存(影响 INFORMATION_SCHEMA 访问速度)
open_files_limit = 65535            # 允许打开的最大文件数(需配合系统 ulimit)

# ========================
# InnoDB 引擎设置
# ========================
default-storage-engine = InnoDB     # 默认存储引擎
innodb_buffer_pool_size = 8G        # InnoDB 缓存池(建议设置为物理内存的 60%~80%)
innodb_log_file_size = 1G           # redo 日志文件大小
innodb_log_buffer_size = 64M        # redo 缓冲区大小
innodb_flush_log_at_trx_commit = 2  # redo 刷盘策略:0(最快)1(最安全)2(折中)
innodb_file_per_table = 1           # 每张表使用独立的表空间文件
innodb_flush_method = O_DIRECT      # 使用 O_DIRECT 避免双重缓存
innodb_io_capacity = 200            # IO 能力指标(SSD 可设大如 1000+)
innodb_read_io_threads = 4          # 读 IO 线程数
innodb_write_io_threads = 4         # 写 IO 线程数

# ========================
# Binlog 设置(主从/备份)
# ========================
server-id = 1                       # 唯一的服务器 ID(主从复制需要)
log-bin = /var/log/mysql/mysql-bin  # 开启 binlog 并指定路径
binlog_format = ROW                # binlog 格式(ROW 支持更精确的复制)
expire_logs_days = 7               # binlog 保留天数
sync_binlog = 1                    # binlog 同步策略(1:每次提交同步最安全)

# ========================
# GTID 复制(主从复制需用)
# ========================
gtid_mode = ON                     # 开启 GTID 模式
enforce_gtid_consistency = ON      # 强制 GTID 一致性
log_slave_updates = 1              # 从库记录 relay-log 中的 SQL 到 binlog
skip_slave_start = 1               # 启动时不自动开启从库复制线程

# ========================
# 安全性
# ========================
secure_file_priv = ""              # 限制 `LOAD DATA` 和导出文件路径,留空表示不限制

# ========================
# 性能监控插件(可选)
# ========================
performance_schema = ON            # 开启性能模式(内存开销小,建议开启)
performance_schema_instrument = '%=on'

# ========================
# 临时表配置
# ========================
tmp_table_size = 128M              # 内存临时表最大值
max_heap_table_size = 128M         # Heap 表最大值(影响内部内存临时表)

# ========================
# 开发调试用(生产慎用)
# ========================
# general_log = ON
# general_log_file = /var/log/mysql/mysql-general.log

调整建议