MySQL索引入门(一文搞定)


前言

MySQL 的索引是面试的高频考点也是我们在日常开发中用于优化 SQL 语句性能的神器。

今天跟大家讲一讲 MySQL 的索引入门篇章。对索引的知识有大概的了解…


什么是索引?

索引就是一种可以快速查询的数据结构,在MySQL中担任着提高查询性能的角色。

打个比方:一本书的目录,通过目录我们可以快速找到这本书的第一章,第二章分别在第几页,这个目录相当于索引

索引的特点

在创建表时,如果没有主动的创建索引,存储引擎 Innodb 会选择一个唯一,不重复,不为空的字段作为主键索引。如果没有这个字段的话,Innodb 会创建一个隐式的自增的索引。

索引的优点与缺点

优点:索引可以提高性能的查询。提高SQL性能

缺点:索引不是越多越多,当执行更新SQL语句时,索引也会动态的改变。这会拉慢更新的性能。
而且索引是占用物理存储空间的,所以索引是会造成空间的使用加大。

索引的分类

索引可以按照数据结构、字段特性、字段个数、物理存储进行分类。

按照数据结构分类

索引的数据结构有Hash,B 树,B+树,RTree 等等,目前 Innodb 存储引擎默认的索引结构是B+树。存储引擎的基础知识可以看往期文章(MySQL 的存储引擎)。

为什么 Innodb 要选择 B+ 树当做默认的存储引擎呢?

B+树是 B 树的一种变异树,B 是 balance平衡的意思。

我们来看一看B+树与B树的区别就知道为什么选择B+树作为存储引擎的索引结构了。

1.B+树只有叶子节点是存放索引(Key)跟数据(Data)的,其他节点都是存放索引。而B树的所有节点都存放索引(Key)跟数据(Data)。
2. B+树的叶子节点是类似于双向链表,可以适用于范围查询。而 B 树没有这种结构

相比之下,B+树的查询性能更加的稳定以及效率高。

按照物理存储分类

物理存储分类分为:聚簇索引(主键索引)与非聚簇索引(二级索引)。

聚簇索引:索引与数据存储在一块,比如Innodb默认的主键索引结构就是聚簇索引。

非聚簇索引:索引与数据分离的结构,这样会出现二次查询,也就是回表。比如 Mylsam 使用的是非聚簇索引。

这里讲一下,Innodb 与 Mylsam 的默认的索引的数据结构都是B+树,但是两者各有不同。

按照字段特性分类

按照字段特性分类:主键索引,唯一索引,普通索引,前缀索引

主键索引:不为空,不可重复。Innodb 默认一定会创建。
唯一索引:不为空,不可重复。一般会用于增加查询性能。
普通索引:可以为空,可重复,一般会用于增加查询性能。
前缀索引:一般是varchar等字符串值时,可以字符串缩减成前几个字符当做索引。

按照字段个数分类

按照字段个数分类:单一索引与联合索引

单一索引:一个字段当做一个索引,其中唯一索引,普通索引等等都是单一索引。
联合索引:多个字段组成一个索引,如果你一个表需要建立多个索引,建议使用联合索引。

联合索引存在最左匹配原则,也就是当(a,b,c)是一个联合索引时,你使用索引字段来当做条件查询时要遵循从左到右的使用,不然会索引失效。

打个比方

  1. 当where a = 1 索引生效
  2. 当where a = 1 and b = 2 索引生效
  3. 当where b = 2 and c = 3 索引失效
  4. 当where b = 1 and a = 2 索引生效

由上可以看出,联合索引必须要从左到右的使用即遵循最左匹配原则才能生效。为什么第四种当where b = 1 and a = 2 索引生效是生效的呢,因为SQL语句执行查询时会有优化器,优化器将SQL语句进行优化,将 a 放在 b 前面。


总结

总的来说,索引就是一个可以实现快速查询的数据结构,优点是查询快,更新慢,浪费空间,Innodb 默认的索引数据结构是B+树,索引可以按照多种特性进行分类。


有启发点个赞 🌹

好文章不要错过,最近給大家分享的文章

1.MySQL的基础架构
2.SQL语句的执行流程
3.MySQL 的存储引擎

预计下篇分享:MySQL 索引进阶(查漏补缺)

本篇参考:小林coding ,JavaGuide

我是小辉,正在进行 Java 实习的 24 届应届毕业生。欢迎关注,持续分享,包括但不限于技术文章。全网同名…

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java编程小辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值