SQL 索引入门:为什么加了索引反而变慢了
【摘要】 索引用 B+ 树加速查询,但写入时要付出维护代价。本文讲清何时该加索引、联合索引最左前缀原则,以及索引失效的常见写法,加索引前先跑 EXPLAIN。
面试时人人都知道"查询慢就加索引",但很少有人说清索引的代价。这篇入门笔记用最小的篇幅讲清索引的原理、什么时候该加、什么时候加了反而坏事。
一、索引是什么
可以把索引理解成书的目录:没有目录时要一页页翻(全表扫描),有了目录先查目录再定位(B+ 树查找)。MySQL 的 InnoDB 引擎默认用 B+ 树组织索引,等值查询和范围查询都能受益。
二、什么时候该加索引
- WHERE、JOIN、ORDER BY 反复用到的列;
- 区分度高的列(如手机号),区分度太低的列(如性别,只有两个值)加了也没意义;
- 多个列经常一起查询时,考虑建联合索引,并遵循最左前缀原则。
三、为什么加了索引反而变慢
- 索引不是免费的:每次 INSERT/UPDATE 都要同步维护所有相关索引,写入密集的表加一堆索引会明显拖慢写入;
- 索引失效的常见写法:对索引列使用函数或运算、前导模糊查询 LIKE '%xx'、隐式类型转换(字符串列传了数字)——这些都会让优化器放弃走索引;
- 索引本身也占磁盘空间,一张表建十几个索引是灾难。
结语:索引是典型的"以写入和空间换查询"的权衡。加索引前先用 EXPLAIN 看看执行计划,确认真的用上了,再上线。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)