文章目录
“我SQL写得溜啊!” —— 直到你看到慢查询日志里的10秒响应时间(啪啪打脸)。今天我们就来聊聊那些让DBA血压飙升,让程序员连夜跑路的MySQL调优实战经验!(建议收藏备用)
一、索引篇:你以为建了索引就完事了?
1.1 索引选型三大坑(必考!!)
- 最左前缀原则:联合索引(a,b,c)时,where条件没a字段?恭喜你喜提全表扫描大礼包!
- 隐式转换陷阱:varchar字段用数字查询?比如
phone=13800138000
(phone字段是varchar)→ 索引直接罢工! - 函数操作禁术:
WHERE YEAR(create_time)=2023
→ 索引当场去世(解决方案:改用范围查询)
1.2 索引失效现场教学
-- 错误示范(索引:age)
SELECT * FROM users WHERE age+1 > 20; -- 表达式操作→索引卒
-- 正确姿势
SELECT * FROM users WHERE age > 19;
二、查询优化:你的SQL正在谋杀数据库!
2.1 三大作死写法(赶紧自查!)
- **SELECT *** → 特别是text/blob字段
- LIMIT深分页:
LIMIT 1000000,20
→ 试试改成WHERE id>xxx - 乱用子查询:能用JOIN解决的别用子查询(实测性能差3倍+)
2.2 EXPLAIN实战解析
(假装这里有执行计划图)重点看:
- type列:ALL→全表扫描(要出大事)
- rows列:扫描行数(超过1万就要警惕)
- Extra列:Using filesort→赶紧优化排序条件
三、配置调参:改个参数性能翻10倍??
3.1 内存分配三剑客(8G内存服务器示例)
# my.cnf关键配置
innodb_buffer_pool_size = 4G # 划重点!占物理内存50-70%
key_buffer_size = 256M
query_cache_size = 0 # MySQL8.0已移除,别挣扎了
3.2 连接数玄学
-- 查看当前配置
SHOW VARIABLES LIKE '%max_connections%'; -- 默认151?不够!
SHOW STATUS LIKE 'Threads_connected%'; -- 实时监控
四、表结构设计:从根源杜绝慢查询!
4.1 字段设计四不要
- 不要用
UTF8
(MySQL的UTF8是假的三字节!用utf8mb4) - 不要用
NULL
(改用默认值,NULL影响索引) - 不要用
ENUM
(改需求要改表结构,大忌!) - 不要用
FLOAT
(精度问题用DECIMAL)
4.2 分区表骚操作
-- 按时间分区示例
CREATE TABLE logs (
id INT,
log_time DATETIME
) PARTITION BY RANGE (YEAR(log_time)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024)
);
五、冷门但致命的优化技巧
5.1 预编译语句防注入+提性能
// Java示例(其他语言类似)
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM users WHERE age > ?");
stmt.setInt(1, 18); // 比拼接SQL安全又高效
5.2 批量插入黑科技
-- 普通插入:10秒
INSERT INTO table VALUES(1);
INSERT INTO table VALUES(2);
...
-- 批量插入:0.5秒!!
INSERT INTO table VALUES(1),(2),(3)...;
六、监控预警:等用户投诉就晚了!
6.1 慢查询日志配置
# 开启慢查询日志
slow_query_log = 1
long_query_time = 1 # 超过1秒的都记录
log_queries_not_using_indexes = 1 # 捕获没走索引的
6.2 自建监控指标体系
监控项 | 危险阈值 | 检查方法 |
---|---|---|
QPS | >2000 | SHOW GLOBAL STATUS |
连接数使用率 | >80% | SHOW VARIABLES/STATUS |
缓存命中率 | <95% | 计算缓存命中率公式 |
七、终极杀招:该跑路时就跑路!
当遇到以下情况时…(咳咳):
- 500G的表没有主键
- 所有字段都是varchar(255)
- 开发说"加个索引不就完了"
- 产品经理要实时统计全表数据
建议直接掏出《MySQL 8.0 Reference Manual》拍在需求文档上(误)!!
写在最后:
调优不是玄学,是科学+艺术!记住这个万能公式:
复杂问题 = EXPLAIN分析 + 慢日志定位 + 适当重构 + 合理配置
(最后偷偷说:遇到实在解决不了的性能问题…加内存真的有用!!)