Mysql存储结构

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

数据结构

Hash

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

优势:sql

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

缺点:性能

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

B-Tree

B-Tree特色:优化

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

B+Tree

B+Tree 是在B-Tree的基础之上作的一种优化,变化以下:3d

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

Mysql为何选择B+Tree

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

相关文章
相关标签/搜索