视频加载失败

MySQL 索引与慢查询优化

410 字
2 分钟
MySQL 索引与慢查询优化

每条查询的时间应该控制在200ms内 否则认为是慢查询

慢查询带来的后果是:IO开销过大,锁持有时间增加,导致数据库吞吐量降低

排查与定位#

  • 开启慢查询日志:slow_query_log=ON,long_query_time=0.2,配合 pt-query-digest 或云监控聚合分析。
  • 用 EXPLAIN 看执行计划,重点看 type(至少到 range,避免 ALL 全表扫描)、key(实际用到的索引)、rows(预估扫描行数)、Extra(Using filesort / Using temporary 都是危险信号)。

JOIN 与数据量#

内联JOIN是求交集,数据变小

外JOIN,会导致数据量过大

  • JOIN 的驱动表尽量选过滤后结果集小的那张,被驱动表的关联列必须有索引。
  • 避免在 JOIN 条件列上做函数运算或类型转换(如字符串列和数字比较),否则索引失效。

索引失效的常见场景#

  • 对索引列使用函数或运算:WHERE DATE(created_at) = ...、WHERE id + 1 = ...。
  • 隐式类型转换:varchar 列用数字比较。
  • 前导模糊匹配:LIKE '%keyword'。
  • 联合索引不满足最左前缀。
  • IN 列表过大:如果 IN 关键字包含的id过多,数据库有可能抛弃索引直接进行全表扫描(优化器认为回表成本高于全表扫描)。

分批查询#

如果单次查询的数据量大于1000,则最好需要分批次进行查询 每批次500条

分批不只为了保护索引,还能控制单次网络包大小、减少锁持有时间与内存占用。配合覆盖索引(只 SELECT 需要的列)效果更好。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MySQL 索引与慢查询优化
https://blog.81vm3.xyz/posts/mysql-index-optimization/
作者
Blume
发布于
2025-11-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Blume
I build interesting things.
公告
欢迎来到我的博客!
分类
标签
最新动态
站点统计
文章
38
分类
5
标签
98
总字数
23,078
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录