【Mysql】索引底层数据结构

What's the index?

 

  • 索引是帮助MySql高效获取数据的排好序的数据结构
  • 索引存储在文件里
  • 索引有很多不同的结构(BineryTree/Hash/BTree

 

Why B+Tree is been used until now?

*BineryTree:没有自动调整功能,如果一直分别加入排序的数据(1-2-3-4-5-6-...),会演变成链表,就失去了索引的意义了。

*HASH:查找一行可以使用,但是对于范围查找无力

*RedBlackTree:数据多的时候高度会过高,导致时间复杂度过高。

*B-Tree:让红黑树从纵向发展转变成横向发展,一个结点存储多个数据。但是上层结点存储了完整数据记录,导致度数低。

CPU一般一次I/O将整个结点放入内存进行查找索引的位置,所以在结点中查找的时间几乎可以忽略不计,所以结点数中的数据个数应该越多越好,所以data中应该不存完整的数据记录

*B+Tree:

 

*页:内存和磁盘之间传输数据的单位

 

 

Something about MyISAM and InnoDB..

对于MyISAM,其索引文件和数据文件不是同一个文件,所以data中存放的是数据地址

*非主键索引和主键索引一样,data存放的都是数据地址,每一个非主键索引都有单独的B+Tree

 

 

InnoDB:数据和索引存放在同一文件-->data中存放的是完整的数据记录--->将所有数据聚集在一起(聚簇索引)

                --->查找速度更快--->相对MyISAM减少了一次查找(地址-数据)

*非主键索引data存储的是主键,不是完整的数据记录

 

InnoDB索引实现(聚集索引)

  • 数据文件本身就是索引文件
  • 表数据文件本身就是B+Tree组织的一个索引结构文件
  • 聚集索引的叶子节点包含了完整的数据记录
  • 为什么InnoDB表必须有主键,并且推荐使用整形自增主键

*自增:这样可以让新增的数据插入到最后,防止数据插入在中间导致分页增加时间

*整形:节省比较时间(可比较与uuid)

  • 为什么非主键索引结构叶子结点存储的是主键值

*一致性:如果一个存的不是主键(数据记录),更改一个数据,就要把所有索引都更改一遍

*节省存储空间:只存一个主键肯定节省存储空间啦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章