MySQL索引篇(三)

                                     MySQL索引篇(三)

索引原理分析

索引存储结构

  • 索引是在存储引擎中实现的,不同的存储引擎会使用不同的索引。
  • MyISM和InnoDB存储引擎只支持B+TREE索引,默认使用BTREE,且不能更换。
  • MEMORY/HEAP存储引擎只支持HASH和BTREE索引。

BTREE和B+TREE数据结构

数据结构示例网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

BTREE是为了磁盘或其他存储设备设计的一种多叉平衡查找树。

  • B树的高度一般都是在2~4个高度,树的高度直接影响IO读写的次数。
  • 如果是三层树结构,可以支撑20G左右的数据,如果是四层树结构,可以支撑几十T的数据。

BTREE和B+TREE的区别

  • BTREE非叶子节点和叶子节点都会存储数据。
  • B+TREE只有叶子节点会存储数据,而且存储的数据都在一行上,并且这些数据都有指针指向,是有序的。

非聚集索引(MyISAM)

  • B+树叶子节点只会存储数据行(数据文件)的指针,和索引文件不在一起,这就是非聚集索引。
  • 非聚集索引包含主键索引和辅助索引都会存储指针的值。

主键索引

这里假设一个表一共有三列,以Col1为主键,上图是一个MyISAM表的主键索引示意图;可以看出MyISAM的索引文件仅仅保存数据记录地址。

辅助索引(次要索引)

在MyISAM中主键索引和辅助索引(Secondary key)在结构上买有任何区别,只是主键索引要求key是唯一的,而辅助索引的key是可以重复的。如果在Col2上建立一个辅助索引,索引结构示意图如下:

同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引;如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应数据记录。

聚集索引(InnoDB)

  • 主键索引的叶子节点会存储数据行,数据和索引在一起,这就是聚集索引。
  • 辅助索引只会存储主键值。
  • 如果没有主键,则使用唯一索引建立聚集索引;如果没有唯一索引,MySQL会按照一定规则创建聚集索引。

主键索引

InnoDB要求表必须有主键(MyISAM可以没有),如果没有显示指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列则MySQL自动为InnoDB表生成一个隐含字段作为主键,类型为长整形。

上图是InnoDB主键索引(同时也是数据文件)的示意图,可以看到叶子节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按照主键聚集。

辅助索引(次要索引)

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说InnoDB的所有辅助索引都引用主键为data域。

 聚集索引的实现方式使得按照主键搜索十分高效,但是辅助索引需要检索两边索引,首先检索辅助索引获得主键,然后用主键到主键索引中获得数据记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值