前言
索引是帮助MySQL高效获取数据的数据结构
常用索引
1、普通索引
普通索引是最基本的索引,仅用于加速查询,没有任何限制:可以为空、可以重复
2、唯一索引
唯一索引与普通索引类似,但索引列的值必须唯一
3、主键索引
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值
4、组合索引
组合索引是多列值组成的一个索引,专门用于组合搜索,使用组合索引时遵循最左前缀原则
5、全文索引
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,目前只有char、varchar,text 列上可以创建全文索引
6、空间索引
空间索引是对空间数据类型的字段建立的索引,分别是GEOMETRY、POINT、LINESTRING、POLYGON
创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建
创建索引的原则
- 索引列的数据类型占用存储空间越少越好,因为索引本身也是占用磁盘空间的
- 索引列的数据不建议为空
- 索引列的数据重复率不要超过80%
- 频繁更新的列不要创建索引
- 在业务允许范围内,建议使用自增长作为主键
索引的数据结构
在线演示
在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节
文件系统中,最小单位是块,一个块大小就是4k
InnoDB存储引擎最小储存单元是页,一页大小就是16k
BTree 数据结构
B树中每个节点最多存储(2个关键字、2个数据区、3个节点引用),一个节点如果超过2个关键字就会自动分裂
B树查找的时间复杂度为O(h * lgn),h为树高,n为每个节点存储关键字的数量
B树相对于平衡二叉树,在数据量相同的情况下,B数据的高度要低于平衡二叉树,减少了IO查询次数
B+Tree 数据结构
B+树中的根节点和支节点存储的是(关键字、节点引用),相比于B树,其单位节点要存储更多的关键字
B+树的叶子节点存储的是(关键字、数据区),叶子节点是顺序排列的并且相邻叶子节点具有相互引用的关系,非常适合排序
总结
B树的每个节点都存储了数据区、而B+树只有叶子节点才会存储数据区,所以B+树在检索时的IO消耗要小于B树
B+树的叶子节点都是顺序排列的并且相邻叶子节点具有相互引用的关系,所以非常适合做排序
不同数据引擎下的索引实现
MyISAM 数据引擎下的索引
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
InnoDB 数据引擎下的索引
InnoDB引擎使用B+Tree作为索引结构,叶节点的data域存放的是完整的数据记录
聚簇索引 和 非聚簇索引
MySQL 默认数据引擎 InnoDB 中,数据在进行添加时必须和某一个索引列进行绑定,绑定优先级如下:
1、如果有主键,则和主键进行绑定
2、如果没有主键,则和唯一键进行绑定
3、如果没有唯一键,则根据系统生成的6字节rowid进行绑定
结论:和数据进行绑定的索引称之为聚合索引,反之为非聚合索引。一张表中只能有一个聚合索引,非聚合索引可以有多个
- 聚簇索引
- 非聚簇索引
- 总结
聚簇索引的叶子节点直接存储了具体信息或其内存地址,通过内存地址即可快速找到相应的行数据
在非聚簇索引的叶子节点上存储的是主键 ID,【回表查询】当使用非聚簇索引查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上查找数据
覆盖索引(避免回表查询)
覆盖索引的核心是从非聚簇索引要数据,普通索引(单字段)、联合索引以及唯一索引都能实现覆盖索引的作用