首先,索引的概念是帮助mysql高效获取数据的排好序的数据结构。抓住关键词,是有序的,数据结构。
索引有哪些数据结构呢?
-
二叉树
-
红黑树
-
Hash表
-
B-Tree
那么mysql主要用的是哪种索引结构呢?
在此图中可以看出来,mysql主要用的是BTREE和HASH两种结构模式,那他们两个有什么区别呢? -
Hash
对索引进行hash计算定位数据存储的位置
很多时候,hash索引比B+树索引更高效
仅能满足=和in查询,不支持范围查找
hash冲突
当然最主要用的还是B+树,也就是B树的升级版 -
B+树
数据结构模型,在此附上在线生成各种数据结构模型的网址(在线生成树结构)
下图的B+树,由五个字段值,juan,liushan,wang,wudi,zhao组成的一颗B树
特点:
从上图的叶子节点就可以看出B树确实是从左到右排好序的。
非叶子节点不存储data(此data有可能存的是行记录所在的磁盘地址,也有可能存的是主键索引的地址,当然这又与是否是聚集索引和非聚集索引有关);
叶子节点包含所有的索引字段,通过上图也能看出来,叶子节点,也就是最后一层是所有的索引字段都在此;
叶子节点之间用指针链接,提高了区间访问性能。(和双向链表类似,有兴趣可以去学一下)
在上图,第一行存在一页当中,第二行又存在 一页当中。每一页差不多分配16KB大小,每一页尽可能多存点数据,当查找数据时,是一次性把当页的数据全取出来,放到内存,进行比对。虽然进行比对也耗费时间,但比起磁盘IO,花费的时间要少的多。
当存一个主键索引为bigInt,8字节,再加上存放下一页的索引地址占用的4字节,一页可以存放多少索引呢?16000/12=1333.差不多每页可以存放1333个索引字段。