MySql:索引的底层原理

 

索引的底层原理

MySQL支持两种索引,一种是B-树(B树)索引,一种是哈希表索引,这两种索引的查询效率较高。

MYSQL中InnoDB存储引擎是(基于B-树 ,实际MYSQL采用的是B+树) 的索引结构。

B-树的特点:

B-树是一种 m 阶平衡树,叶子节点都在同一层,由于每一个节点存储的数据量比较大,索引在整个B-树的层数是比较低的,基本上不超过三层。

为什么将B-树的节点大小一般设置为和磁盘块大小一致 ?

索引是以文件的形式存储在磁盘上,磁盘每次往内存加载数据是有基本单位的,磁盘的读取是按block块操作的(内存是按page页面操作的),因此B-树的节点大小一般设置为和磁盘块大小一致,从磁盘加载一个节点到内存里面,加载一个B-树节点,就相当于加载一个block块,这样就可以通过一次磁盘I/O把一个磁盘块的数据全部存储下来,有多少节点,则仅需要加载多少次。

目的:在进行节点读取或者存储的过程,保证磁盘I/O的操作次数是最少的。

(MySQL的读写效率,主要集中在磁盘I/O上)。

MySQL为什么要采用 B+ 树存储索引结构呢而不是 B- 树?

  1. B-树的每一个节点,存储的是 关键字和对应的数据地址,而B+树的非叶子节点只存关键字,不存数据地址。因此B+树的每一个非叶子节点存储的关键字是远远多于B-树的,B+树的叶子节点存放关键字和数据,从树的高度上来说,B+树的高度要小于B-树,使用的磁盘I/O次数少,因此查询会更快一些。(相同数量的节点数,B+树存放的数据多,相同数量的数据,B+树节点数就少 -> 树的高度可能就小 -> 查询的效率就会高
  2. B-树由于每个节点都存储关键字和数据,因此离根节点近的数据,查询的就快,离根节点远的数据,查询的就慢,耗时不均匀;B+树所有的数据都存在叶子节点上,因此在B+树上搜索关键字,找到对应数据的时间是比较平均的,没有快慢之分。
  3. B-树上如果做区间查找,遍历的节点是非常多的,B+树是能够很好满足的;
    B+树所有叶子节点被连接成了有序链表结构,因此做整表遍历区间查找是非常容易的。

哈希索引:

是由哈希表实现的,哈希表对数据无法做到排序,因此不适合做区间查找,效率非常低,需要搜索整个哈希表结构。

 

你可能感兴趣的:(MySql)