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语句大量的用到了上面这些内容,那么就有必要添加索引
需要注意的是,对于自然连接,由于索引未暴露,因此不能使用索引
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
如何避免不必要的索引
- 索引的区分度要高,对于上万数据,若一个字段的所有情况只有三种,这就叫区分度低,没有必要加索引
- 索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引
- 索引尽量在原基础上进行扩展(联合索引),减少新增索引
排除多于索引
对于多个列A,B,C若存在索引ABC,则没必要添加索引A,至于B和C需要跟据最左匹配原则
MySQL 索引(尤其是组合索引)遵循一个规则,叫做 最左前缀匹配原则。
这个原则的意思是,MySQL 在使用组合索引时,必须从索引的 最左边的列 开始匹配,且只能沿着索引的顺序依次向右匹配
直到遇到范围查询(如 >, <, BETWEEN, LIKE)时,匹配会被中断。
例子: 索引 (a, b, c, d)
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没用到索引
改写
SELECT * FROM table WHERE a = 1 AND b = 2 AND d = 4 AND c > 3 ;
回表
我们需要知道索引的执行顺寻
索引会先冲where语句中找到我们自定义的索引的位置(此处的索引位置存放的除了我们定义的索引外还存了一个主键位置)
然后索引树会找到主键树,然后主键树再次去找才能找到我们的节点
回到主键索引树搜索的过程,我们称为回表。
回表对我们的搜索速度有一个很大的降低,因此我们应该尽可能避免回表。
如何避免回表呢?
我们来看这样两个语句
SELECT * from db where k=1;
SELECT k form db where k=1;
这两个语句中下面这个就不需要回表,为什么呢?
回忆我们的搜索过程,我们会先去走自定义索引,这个时候我们已经带到我们SELECT索需要的所有的值了, 因此没有必要再向下寻找ID再找到原列,因此就避免了回表
这一过程又被称为覆盖索引