索引格式

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

缺点
1、利用Hash存储的话,需要将所有的数据文件添加到内存,浪费内存空间
2、如果所有的查询都是等值查询,那么hash查询速度很快,但是实际情况中,大部分是范围查询。所以不太何时

Mysql中memory存储引擎用的就是Hash

B-树索引格式

由于二叉树,avl树,红黑树。都会因为树的深度过深而造成io次数变多,影响数据读取的效率。

mysql索引的前缀原则 mysql索引格式_mysql索引的前缀原则

1、所有的键值分布在整棵树中
2、搜索有可能在非叶子节点结束,在关键字全集内做一次查找,性能逼近二分查找
3、每个节点最多拥有m个子树
4、根节点最少有两个字数
5、分支节点至少拥有m/2颗子树,(除根节点和子节点外都是分支节点)
6、所有叶子节点都在同一层,每个节点最多可以有m-1个key,并且以升序排列

比如读取主键为28的数据
找到是16-34之间的,直接找磁盘块3,发现是25-31之间的,直接找磁盘块8。 即经历了三个磁盘块,3次IO过程完成读取

每个磁盘块是16K,三个磁盘块是48K。 假设data不占用字节,或者很小。那么三块磁盘块最多有161616条=4096条数据。三层B树仅能支持四千条数据。况且data也会占用了字节数

Mysql使用B+树索引

mysql索引的前缀原则 mysql索引格式_子节点_02

B+树是B-树的一种优化
1、B+树每个节点可以包含更多的节点,原因1:为了降低树的高度,原因2:数据范围变为多个区间,区间越多,数据检索越快
2、非叶子节点存储key,叶子节点存储key和数据
3、叶子节点两两指针相互连接(符合磁盘预读特性),顺序查询性能更高

父节点不存储数据,假设估算每个指针或键值占用10字节,那么每个磁盘块即1600条,三块磁盘空间即可有40960000千万级别

InnoDB和MyISAM的存储方式

InnoDB 聚簇索引,叶子节点直接放置数据
1、InnoDB通过B+树结构对主键创建索引,然后叶子节点中存储记录。如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id作为主键
2、如果创建索引的键是其他字段,那么叶子节点存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫回表

mysql索引的前缀原则 mysql索引格式_主键_03


MyISAM 非聚簇索引,也是使用B+树。叶子节点不放置数据,只是存放对应的地址


mysql索引的前缀原则 mysql索引格式_主键_04