一、什么是索引
索引是帮助MySQL高效获取数据的排好序的数据结构。
索引存储在文件中。
二、MySQL索引结构的选择
索引可以使用的结构有很多种,例如二叉树、红黑树、HASH、B Tree等。MySQL索引经常使用的数据结构是B+Tree(B Tree的一个变种)。
除了BTREE的这几种数据结构都存在一定的性能问题:
- 二叉树
向二叉树中插入5个元素时,数据存储的结构如下:
当索引值顺序递增时,查询索引值越大的数据,效率越低。
想查询0005的数据时,通过这种结构的索引查找数据,需要查询5次,查询效率很低。
- 红黑树
向红黑树中插入5个元素时,数据存储的结构如下:
红黑树在二叉树的基础上,进行了自动平衡,性能上较二叉树好一些,但是如果数据量过大时,树的深度也很大,效率会很低。
想查询0005的数据时,需要3次查询。
- HASH
向hash表中插入5个元素,数据存储结构如下:
只需要进行一次hash运算就可以查询到对应的数据,但是如果需要范围查询,hash就不太适合。
- B Tree
向B Tree中插入5个元素,数据存储结构如下:
- 在B Tree中每个节点(上图中是3个节点)中可以存储多个元素(每个元素携带索引及数据)
- 每个节点存储的元素个数,叫度(Degree)
- 节点中的索引值从左到右递增排列
- 叶子节点的指针为空
度不可以无限大,是因为磁盘和内存进行数据交换时有大小限制。
- B+Tree(B Tree变种)
向B+Tree中插入7个元素,数据的存储结构如下:
- 非叶子节点不存储数据,只存储索引,可以增大度
- 相邻的叶子节点之间互相存在指针,提高了范围查询的性能
- 冗余了一定量的索引
三、MyISAM引擎、InnoDB引擎索引的实现
存储引擎是针对表来说,在同一个数据库中可以创建InnoDB的表,同时也可以创建MyISAM引擎的表
MyISAM引擎
MyISAM引擎的表会在磁盘中存储3种文件:
.frm 表结构文件
.MYD 数据文件
.MYI 索引文件
- 叶子节点存储的数据是当前记录所在的地址,索引和数据时分离的,这样的索引也称为聚簇(聚集)索引。
- 主键索引和非主键索引的结构没有区别。
InnoDB引擎
InnoDB引擎的表,在磁盘中会存储2中文件
.frm 表结构文件
.ibd 数据文件
-
索引和数据存储在一起,这样的索引也叫聚簇(聚集)索引。
-
主键索引的叶子节点存储的是完整数据。
-
非主键索引的叶子节点存储的是主键的值,防止多个索引存储数据导致数据一致性问题并且也节省了磁盘空间。