Skip to content

5.MySQL——索引

更新: 5/9/2025 字数: 0 字 时长: 0 分钟

特别鸣谢

美团技术团队

ps:真的很建议大家多读一读大厂的文章,大厂并不是那么遥不可及,里面有很多的文章是现阶段我们可以学习的

(好吧,我承认我还是不够格大厂QwQ)

什么是索引

对于这个问题,我想大家都有一个很简答的答案——索引是一种可以用于提升查询速度的数据结构

InnoDB 存储引擎支持的索引有 B+ 树索引、全文索引、R 树索引,而我们最为常用的是B+树索引, 使用B+树实现了搜索优化,因此索引可以提升搜索速度

要不要加索引

想必大家都知道索引可以提升查询速度,但会减低修改速度,因此很多时候不敢加索引。

在我们的实际业务中,查询语句的数量一定实时远远大于修改语句的,且修改语句一般也很少会大量修改n行sql, 因此索引的增加我们一律按照有需要就加

什么是有需要

MySQL对where,order by,聚合函数(group by)、表连接(join)、聚合函数(如max)支持使用索引来提高查询效率。 一旦你的SQl语句大量的用到了上面这些内容,那么就有必要添加索引

需要注意的是,对于自然连接,由于索引未暴露,因此不能使用索引

sql
select * from tb1 natural join tb2 where tb1.a = 1  #错误
select * from tb1 natural join tb2 on  tb1.a=tb2.a where tb1.a = 1 正确,使用了索引a

如何避免不必要的索引

  1. 索引的区分度要高,对于上万数据,若一个字段的所有情况只有三种,这就叫区分度低,没有必要加索引
  2. 索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引
  3. 索引尽量在原基础上进行扩展(联合索引),减少新增索引

排除多于索引

对于多个列A,B,C若存在索引ABC,则没必要添加索引A,至于B和C需要跟据最左匹配原则

text
MySQL 索引(尤其是组合索引)遵循一个规则,叫做 最左前缀匹配原则。
这个原则的意思是,MySQL 在使用组合索引时,必须从索引的 最左边的列 开始匹配,且只能沿着索引的顺序依次向右匹配
直到遇到范围查询(如 >, <, BETWEEN, LIKE)时,匹配会被中断。

例子: 索引 (a, b, c, d)

sql
SELECT * FROM table WHERE a = 1 AND b = 2 AND c > 3 AND d = 4;

跟据索引(a, b, c, d)在SQL语句中寻找, a = 1 AND b = 2 AND c > 3

在c>3时,由于遇到范围查询,停止使用索引,因此d没用到索引

改写

sql
SELECT * FROM table WHERE a = 1 AND b = 2 AND d = 4 AND c > 3 ;

回表

我们需要知道索引的执行顺寻

索引会先冲where语句中找到我们自定义的索引的位置(此处的索引位置存放的除了我们定义的索引外还存了一个主键位置)

然后索引树会找到主键树,然后主键树再次去找才能找到我们的节点

回到主键索引树搜索的过程,我们称为回表。

回表对我们的搜索速度有一个很大的降低,因此我们应该尽可能避免回表

如何避免回表呢?

我们来看这样两个语句

sql
SELECT * from db where k=1;

SELECT k form db where k=1;

这两个语句中下面这个就不需要回表,为什么呢?

回忆我们的搜索过程,我们会先去走自定义索引,这个时候我们已经带到我们SELECT索需要的所有的值了, 因此没有必要再向下寻找ID再找到原列,因此就避免了回表

这一过程又被称为覆盖索引

本站访客数 人次      本站总访问量