欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql存储结构

程序员文章站 2022-03-26 13:34:18
索引是一种加快查询速度的数据结构,常用索引结构有hash、B Tree和B+Tree。本节通过分析三者的数据结构来说明为啥Mysql选择用B+Tree数据结构。 数据结构 Hash hash是基于哈希表完成索引存储,哈希表特性是数据存放是散列的。 优点: 等值查询快,通过hash值直接定位到具体的数 ......

索引是一种加快查询速度的数据结构,常用索引结构有hash、b-tree和b+tree。本节通过分析三者的数据结构来说明为啥mysql选择用b+tree数据结构。

数据结构

hash

Mysql存储结构

hash是基于哈希表完成索引存储,哈希表特性是数据存放是散列的。

优点:

等值查询快,通过hash值直接定位到具体的数据。

缺点:

  1. 范围查询效率低(表中的数据是无序数据,在日常开发中通常需要范围查询,该情况下hash需要一个一个查找后合并返回)
  2. hash表在使用的时会将所有数据加载到内存,比较消耗内存
  3. hash算法不好会出现hash碰撞的情况
  4. 哈希索引只包含哈希值和行指针,而不存储字段值,索引不能使用索引中的值来避免读取行
  5. 哈希索引不支持部分列匹配查找,哈希索引是使用索引列的全部内容来计算哈希值

b-tree

Mysql存储结构

b-tree特点:

  1. 所有键值数据分布在整棵树各个节点中
  2. 搜索有可能在非节点结束,在关键字全集内查找,类似二分查找
  3. 所有叶子节点都在同一层,并且以升序排列

b+tree

Mysql存储结构

b+tree 是在b-tree的基础之上做的一种优化,变化如下:

  1. b+tree 非叶子节点不存放数据
  2. 叶子节点存储关键字和数据,非叶子节点的关键字也会沉到叶子节点,并且排序
  3. 叶子节点两两指针相互连接,形成一个双向环形链表(符合磁盘的预读特性),顺序查询性能更高

mysql为什么选择b+tree

Mysql存储结构

mysql官网文档中写到innodb索引用的是 b-tree,但是底层用的是b+tree。mysql存储数据是以页为单位,默认一个页可以存放16k数据。假设b-tree和b+tree都是3层深度,表中每个记录为1k(假设的,一般不会这么大,别较真),那么三层深度的b-tree存储 16 x 16 x 16 = 4096(比这个数还要少,因为每个页中还要存放指针和其它的数据)。b+tree第一、二层存放的是key,假设是long类型的主键,那么第一、二层每页存放数据约为 16 x 1024 / 8 = 2048,三层深度可以存放 2048 x 2048 x 16 = 6700w。mysql查询过程是按页加载数据的,每加载一页就是一次io操作,b+tree进行三次io可以查询6700w数据量。从这里也可以知道mysql一般设置三层深度就足够了。