SQL 索引入门:为什么加了索引反而变慢了

举报
yd_213494201 发表于 2026/10/29 07:47:26 2026/10/29
【摘要】 索引用 B+ 树加速查询,但写入时要付出维护代价。本文讲清何时该加索引、联合索引最左前缀原则,以及索引失效的常见写法,加索引前先跑 EXPLAIN。

面试时人人都知道"查询慢就加索引",但很少有人说清索引的代价。这篇入门笔记用最小的篇幅讲清索引的原理、什么时候该加、什么时候加了反而坏事。

一、索引是什么

可以把索引理解成书的目录:没有目录时要一页页翻(全表扫描),有了目录先查目录再定位(B+ 树查找)。MySQL 的 InnoDB 引擎默认用 B+ 树组织索引,等值查询和范围查询都能受益。

二、什么时候该加索引

  • WHERE、JOIN、ORDER BY 反复用到的列;
  • 区分度高的列(如手机号),区分度太低的列(如性别,只有两个值)加了也没意义;
  • 多个列经常一起查询时,考虑建联合索引,并遵循最左前缀原则。

三、为什么加了索引反而变慢

  • 索引不是免费的:每次 INSERT/UPDATE 都要同步维护所有相关索引,写入密集的表加一堆索引会明显拖慢写入;
  • 索引失效的常见写法:对索引列使用函数或运算、前导模糊查询 LIKE '%xx'、隐式类型转换(字符串列传了数字)——这些都会让优化器放弃走索引;
  • 索引本身也占磁盘空间,一张表建十几个索引是灾难。

结语:索引是典型的"以写入和空间换查询"的权衡。加索引前先用 EXPLAIN 看看执行计划,确认真的用上了,再上线。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。