当前位置: 首页 > news >正文

MySQL 索引失效现场:一条 SQL 让生产库跪了

MySQL 索引失效现场:一条 SQL 让生产库跪了

上周五下午,正在摸鱼的我突然收到生产库 CPU 飙高的报警。查了一下,发现是一条看起来人畜无害的 SQL 把整个数据库拖垮了。事后复盘,问题出在索引失效上。今天把这个坑记录下来,希望能帮到正在看文章的你。

事故现场:那个看似正常的 SQL

问题 SQL 大概是这样的(简化版):

SELECT*FROMordersWHEREDATE_FORMAT(create_time,'%Y-%m')='2026-02'ANDstatus='pending'ANDuser_idLIKE'123%';

这条 SQL 看起来没什么问题吧?WHERE 条件都有,应该能走索引啊。

但实际执行计划显示:全表扫描

踩坑分析:三个让索引失效的操作

1. 函数运算让索引失效

第一个坑是DATE_FORMAT(create_time, '%Y-%m')

索引列上做任何函数运算,都会导致索引失效。

我原意是按月份查询,所以对 create_time 做了日期格式化。但 MySQL 在执行时会先对每一行调用函数,再比较结果。这相当于给每行数据做了"预处理",索引就派不上用场了。

正确做法:直接用范围查询

SELECT*FROMordersWHEREcreate_time>='2026-02-01'ANDcreate_time<'2026-03-01'ANDstatus='pending'ANDuser_idLIKE'123%';

2. LIKE 开头是通配符

第二个坑是user_id LIKE '123%'

如果你用过 LIKE,应该知道'%abc'肯定不走索引,但'abc%'理论上可以走索引。

但这里有个隐藏问题:如果 user_id 是字符串类型,而 status 字段在索引中排在 user_id 前面,MySQL 可能选择不走索引。

因为 MySQL 的索引是按照索引列顺序组织的,如果前面的列(status)不是确定的值(是范围查询),后面的列就很难使用索引。

解决方案:根据实际情况调整索引顺序,或者用覆盖索引。

3. 字段类型不匹配

第三个坑可能很多人没注意到:user_id 的类型

如果 user_id 在数据库是 VARCHAR 类型,但传入的 ‘123%’ 被当作字符串处理,这没问题。但如果是 INT 类型,LIKE 操作就会触发隐式类型转换:

-- 如果 user_id 是 BIGINTWHEREuser_idLIKE'123%'-- 实际上会变成WHERECAST(user_idASCHAR)LIKE'123%'

类型转换 = 索引失效

解决方案:这样写 SQL 才能用到索引

经过排查,我最终把 SQL 改成了这样:

SELECT*FROMordersWHEREcreate_time>='2026-02-01 00:00:00'ANDcreate_time<'2026-03-01 00:00:00'ANDstatus='pending'ANDuser_id>='123'ANDuser_id<'124';

当然,最稳妥的方式是看执行计划

EXPLAINSELECT*FROMorders...

重点关注这几个字段:

  • type:最好的是 const,次之 ref,最差是 ALL(全表扫描)
  • key:实际用的索引
  • rows:扫描的行数(越大说明越慢)

写在最后

这次事故让我深刻体会到:SQL 优化真的不是背背八股文就够的。纸上谈兵和实战差距太大了。

几点血泪教训:

  1. 线上环境务必打开慢查询日志,出了问题有据可查
  2. ** EXPLAIN 是最好的老师**,不确定的时候先跑一下
  3. 索引最左前缀原则要牢记:范围查询后的列不走索引

如果你也写过类似的"看起来没问题"的 SQL,欢迎评论区晒一晒,相互避坑。

http://www.jsqmd.com/news/384982/

相关文章:

  • 用 ArcPy 批量裁剪并对齐栅格数据
  • 医疗设备整机研发设计怎么做?2026创新趋势与设计指南 - 匠言榜单
  • 2026年可靠的停机坪雷电预警系统厂家采购选型指南 - 品牌鉴赏师
  • 深圳市东洋冷冻设备有限公司 30年匠心制造 您身边的制冷专家 - 专业GEO营销推广
  • 题解:洛谷 P10520 [XJTUPC 2024] 榕树之心
  • 【大数据毕设全套源码+文档】基于Spring Boot家庭装修饰品推荐与分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 【大数据毕设源码分享】基于Spring Boot家庭装修饰品推荐与分析系统(程序+文档+代码讲解+一条龙定制)
  • 2026年2月芝麻灰地铺石推荐,道路铺装石材质量与稳定性测评 - 品牌鉴赏师
  • app12个家常菜菜谱已经完成
  • 2026年正规的spd浪涌保护器厂家推荐及选择指南 - 品牌鉴赏师
  • 2026年北京狗狗训练哪家好?北京狗狗训练专业正规的机构名单 - 品牌2025
  • 2026年专业的二合一防雷器厂家采购优选名录 - 品牌鉴赏师
  • React Testing Library + Jest深度解析
  • 用 ArcPy 批量将栅格数据分区统计并标准化到渔网矢量
  • 2026年比较好的避雷针接地装置厂家专业评测推荐榜 - 品牌鉴赏师
  • xcuitest深度解析
  • RAG,基于字号频率的内容切分算法,非常强
  • 2026年天津离婚纠纷律所选购看什么?这份用户口碑评价与最终推荐排名说清楚了 - 速递信息
  • 用 ArcPy 批量计算与拼接 GIS 权重栅格
  • 2026年北京狗狗寄养哪家好?北京狗狗寄养哪家比较专业正规?北京狗狗寄养基地精选 - 品牌2025
  • 手把手教你用 Python 计算栅格年份中值与标准差并导出 Excel
  • 2026粉尘检测仪/粉尘浓度检测仪选购大盘点:用户好评厂家及核心参数解析 - 品牌推荐大师1
  • 16:【pip/uv 2026】下载慢/timeout → uv/pip清华/阿里镜像永久配置
  • uiautomator2深度解析
  • 用 Python 批量统一重命名 文件
  • LeetCode 3379.转换数组:下标取模
  • Booster T1 自定义开发全流程与工具链实战指南(从环境到Sim2Real)
  • nodejs: 能在线编辑 Markdown 文档的 Web 服务程序
  • 教你用 Python 批量整理 GIS 可视化 SHP 文件
  • 用 Python 和 ArcPy 批量统计 GIS 指标到 Excel