数据库慢了,网站跟着卡?
MySQL是众多网站和系统的核心数据库,但性能瓶颈几乎人人遇过:
- 明明数据才几十万条,却加载超慢?
- 后台报表查询卡成狗?
- 突然CPU飙高,数据库连接数打爆?
真相往往只有一个——查询写得差 / 索引没用好 / 慢SQL堆积如山。
本篇文章将手把手带你通过索引优化、查询缓存机制、慢查询分析三大战术,全面提升MySQL响应效率!
一、索引优化:用对索引,速度翻十倍不是梦
✅ 什么是索引?
索引就像书的目录页,可以加速查找。MySQL中最常用的是B-Tree索引,适合范围/精确匹配查找。
✅ 添加索引的核心策略:
场景 | 建议索引字段 |
---|---|
主键查询 (WHERE id = ? ) | ✅ 主键自动索引 |
联合查询 (WHERE user_id AND status ) | ✅ 创建联合索引 (user_id, status) |
排序查询 (ORDER BY created_at ) | ✅ 针对排序字段建索引 |
模糊查询 (LIKE 'abc%' ) | ✅ 支持索引 |
模糊查询 (LIKE '%abc' ) | ❌ 不走索引(考虑全文索引) |
🧪 示例实战:
sql-- 错误做法(索引不会命中)
SELECT * FROM orders WHERE LEFT(order_no, 5) = 'ABCDE';
-- 正确做法
ALTER TABLE orders ADD INDEX idx_order_no (order_no);
SELECT * FROM orders WHERE order_no LIKE 'ABCDE%';
⚠️ 注意:
- 过多索引 = 写入变慢、空间增大
- 尽量避免函数包裹字段、!=、<>、OR连接多个字段
二、查询缓存:让重复SQL秒开
(注意:MySQL 8.0 起已移除原生查询缓存机制,以下适用于 MySQL 5.7 及以下版本)
✅ 查询缓存原理
MySQL会将相同的 SELECT 查询结果直接缓存,下次相同请求不再查询表,直接返回缓存结果。
开启查询缓存:
sqlSHOW VARIABLES LIKE 'query_cache%';
常见配置:
iniquery_cache_type = 1
query_cache_size = 64M
query_cache_limit = 1M
适合缓存的场景:
- 数据更新频率低(例如:文章、标签、分类)
- 查询频繁、SQL结构一致
⚠️ 适用警告:
- 写操作会使相关缓存失效,导致缓存频繁失效
- 并发高时锁争抢严重,推荐使用应用层缓存(如 Redis)
三、慢查询分析:找出杀你服务器的“元凶SQL”
✅ 什么是慢查询?
指执行时间超过设定阈值的 SQL 语句,通常是逻辑复杂、索引缺失、数据量过大的表现。
开启慢查询日志:
inislow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 超过1秒记录
log_queries_not_using_indexes = 1
重启 MySQL 后即可生效。
🔍 分析慢查询日志:用 mysqldumpslow
bashmysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
-s
表示排序字段:c
=次数,t
=时间-t
表示显示前几条慢查询
想更可视化?用 pt-query-digest !
✅ 慢SQL优化实战案例:
sql-- 原始慢SQL(执行5.6秒)
SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC;
-- 问题分析:
-- 没有索引,排序和筛选全表扫描
-- 优化方式:
ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);
执行时间直接降至 0.2 秒!
四、补充建议:提高 MySQL 性能的额外技巧
技巧 | 实用建议 |
---|---|
分库分表 | 表数据量超千万时,需拆库或按时间分表 |
使用覆盖索引 | 只取索引字段,避免回表:SELECT id FROM |
使用分页优化 | 大页码分页可用 id < ? LIMIT N 替代 offset |
使用连接池 | 提升并发处理能力,防止连接数打爆 |
设置合理连接超时 | wait_timeout /max_connections 配置优化 |
五、优化是一种能力,也是一种责任
别再让数据库成为瓶颈!一条写错的SQL,一张没加索引的表,一次不必要的全表扫描,可能就拖垮整个应用性能。
数据库优化不是一次性的任务,而是持续的性能管理和代码治理实践。
如果你是站长,请检查站点常用SQL是否走索引;
如果你是后端开发,请学会 EXPLAIN 查询执行计划;
如果你是架构师,请配置日志分析工具,监控慢SQL趋势。