一、基础优化(10 分钟上手)
1. 配置文件(my.cnf/my.ini)核心调整
ini
max\_connections = 1000 连接数上限(默认151)
innodb\_buffer\_pool\_size = 2G InnoDB缓存(物理内存50%-70%)
slow\_query\_log = 1 开启慢查询日志
long\_query\_time = 2 记录>2秒的SQL
innodb\_flush\_log\_at\_trx\_commit = 2 读写分离场景提升性能
修改后重启:
systemctl restart mysqld(Linux)/ 服务面板重启(Windows)
2. 表结构优化
-
数据类型:手机号用
CHAR(11)、年龄用TINYINT、时间用DATETIME -
避免
TEXT/BLOB存大文件,改用文件服务器存路径 -
必加主键(自增 INT 优先),查询频繁字段加索引,多条件查用联合索引(遵循最左前缀)
二、SQL 优化(避坑即提速)
1. 慢查询定位
-
查日志:
tail -f /var/log/mysql/slow.log(Linux) -
分析 SQL:
EXPLAIN + 你的SQL(看type是否为 ALL,key是否为 NULL)
2. 核心优化技巧
| 反例 | 正例 |
|---|---|
SELECT * FROM user WHERE id=1 |
SELECT id,username FROM user WHERE id=1 |
WHERE DATE(create_time)='2024-01-01' |
WHERE create_time BETWEEN '2024-01-01 00:00:00' AND '2024-01-01 23:59:59' |
WHERE id IN (SELECT user_id FROM order) |
SELECT u.* FROM user u JOIN order o ON u.id=o.user_id |
LIMIT 10000, 20 |
WHERE id>10000 LIMIT 20 |
3. 索引避坑
-
不生效场景:
!=、IS NOT NULL、字符串不加引号、联合索引不满足最左前缀 -
小表(不建索引,频繁更新字段慎建索引
三、进阶优化(生产环境必备)
1. 读写分离
-
主库写(INSERT/UPDATE/DELETE),从库读(SELECT)
-
核心步骤:主库开二进制日志→从库配置 server-id→主库建复制用户→从库执行同步命令→启动复制
2. 分库分表
-
单表 > 1000 万行用:
-
水平分表:按时间(订单表)、ID 范围 / 哈希(用户表)
-
垂直分表:大表拆小(用户基本表 + 详情表)
-
-
工具:Sharding-JDBC(轻量)、MyCat(中间件)
3. 硬件 / 系统优化
-
用 SSD、数据与日志分盘存
-
Linux 关闭 Swap:
swapoff -a -
调整文件描述符:
echo "* soft nofile 65535" >> /etc/security/limits.conf
四、优化验证
1. 关键指标(执行SHOW GLOBAL STATUS;)
-
Threads_connected:连接数≤max_connections -
Slow_queries:慢查询数越少越好 -
Innodb_buffer_pool_read_hit_rate:缓存命中率 > 99%