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