MySQL索引结构B+Tree

Posted Java大数据笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL索引结构B+Tree相关的知识,希望对你有一定的参考价值。


数据结构图形化网站


https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html


B+Tree


  • 非叶子结点不存储data,只存储索引,可以放更多的索引

  • 叶子结点不存储指针

  • 顺序访问指针,提高区间访问的性能



MySQL查看数据库磁盘页大小sql(InnoDB引擎)

    

show GLOBAL status like 'innodb_page_size'

查询结果为16384(16k)


MySQL索引结构B+Tree


假设数据库索引字段为 bigInt类型一个bigint占用8个字节 旁边指针大概占用6个字节,每个叶子节点占用1k,一页能存储 大概1170(16k/14)条索引,当树高度为3时,能存储1170*1170*16约2千万条数据。


MyISAM索引实现


MyISAM引擎叶子节点的data域存放的是数据记录的地址。MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应的数据记录。MyISAM的索引方式也叫做“ 非聚集索引”,之所以这么称呼是为了与InnoDB的 聚集索引区分。
MyISAM引擎的主键索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
下图是MyISAM索引的原理图:

MySQL索引结构B+Tree


InnoDB索引实现


InnoDB的数据文件本身就是索引文件。data域保存的不是数据地址 而是数据本身。


主键索引
主键索引data域保存的是完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显示指定,则mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
非主键索引(也叫辅助索引)
非主键索引data域存储的是相应记录主键的值而不是地址。InnoDB的所有辅助索引都引用主键作为data域。辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主键索引中检索获取记录。


InnoDB索引和MyISAM索引的区别

  1. 存储结构(主索引/辅助索引)

    InnoDB的数据文件本身就是主索引文件。而MyISAM的主索引和数据是分开的。

    InnoDB的辅助索引data域存储相应记录主键的值。而MyISAM的辅助索引和主索引没有多大区别

  2. MyISAM使用的是表锁

    InnoDB使用行锁

  3. 事务

    MyISAM没有事务支持和MVCC

    InnoDB支持事务和MVCC

  4. 主键

    InnoDB不允许没有主键存在,如果没有设定主键或非空唯一索引,就会自动生成一个6字节的主键,数据是主索引的一部分,附加索引保存的是主索引的值

  5. 外键

    MyISAM不支持

    InnoDB支持


以上是关于MySQL索引结构B+Tree的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库索引原理 | 索引数据结构 | B+Tree

图解MySQL索引--B-Tree(B+Tree)

MySQL索引结构B+Tree

MySQL索引的数据结构

MySQL索引 B+tree和hash

Mysql和ORACLE索引的实现方式