图解MySQL索引:B-树、B+树,终于搞清楚了
看了很多关于索引的博客 , 讲的大同小异 。 但是始终没有让我明白关于索引的一些概念 , 如B-Tree索引 , Hash索引 , 唯一索引….
或许有很多人和我一样 , 没搞清楚概念就开始研究B-Tree , B+Tree等结构 , 导致在面试的时候答非所问!
索引是什么?
索引是帮助MySQL高效获取数据的数据结构 。
索引能干什么?
提高数据查询的效率 。
索引:排好序的快速查找数据结构!索引会影响where后面的查找 , 和order by 后面的排序 。
一、索引的分类
1. 从存储结构上来划分:BTree索引(B-Tree或B+Tree索引) , Hash索引 , full-index全文索引 , R-Tree索引 。
2. 从应用层次来分:普通索引 , 唯一索引 , 复合索引 。
3. 根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引 , 非聚集索引 。
1 中所描述的是索引存储时保存的形式 , 2 是索引使用过程中进行的分类 , 两者是不同层次上的划分 。 不过平时讲的索引类型一般是指在应用层次的划分 。
就像手机分类 , 安卓手机 , IOS手机 与 华为手机 , 苹果手机 , OPPO手机一样 。
- 普通索引:即一个索引只包含单个列 , 一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一 , 但允许有空值
- 复合索引:即一个索引包含多个列
- 聚簇索引(聚集索引):并不是一种单独的索引类型 , 而是一种数据存储方式 。 具体细节取决于不同的实现 , InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行 。
- 非聚簇索引:不是聚簇索引 , 就是非聚簇索引(认真脸) 。
mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引 , 对于频繁访问的表 , innodb会透明建立自适应hash索引 , 即在B树索引基础上建立hash索引 , 可以显著提高查找效率 , 对于客户端是透明的 , 不可控制的 , 隐式的 。
不谈存储引擎 , 只讨论实现(抽象)
Hash索引
基于哈希表实现 , 只有精确匹配索引所有列的查询才有效 , 对于每一行数据 , 存储引擎都会对所有的索引列计算一个哈希码(hash code) , 并且Hash索引将所有的哈希码存储在索引中 , 同时在索引表中保存指向每个数据行的指针 。
本文插图
B-Tree能加快数据的访问速度 , 因为存储引擎不再需要进行全表扫描来获取数据 , 数据分布在各个节点之中 。
【图解MySQL索引:B-树、B+树,终于搞清楚了】
本文插图
是B-Tree的改进版本 , 同时也是数据库索引索引所采用的存储结构 。
数据都在叶子节点上 , 并且增加了顺序访问指针 , 每个叶子节点都指向相邻的叶子节点的地址 。 相比B-Tree来说 , 进行范围查找时只需要查找两个节点 , 进行遍历即可 。 而B-Tree需要获取所有节点 , 相比之下B+Tree效率更高 。
本文插图
案例:假设有一张学生表 , id为主键
本文插图
在MyISAM引擎中的实现(二级索引也是这样实现的)
本文插图
在InnoDB中的实现
推荐阅读
- |为什么使用B+Tree?
- 港股解码|一图解码:继拼多多之后 国美再搭上京东
- 栈外|搜索引擎优化的三个诀窍,送你的网站“C位出道”
- 荔枝荔枝2020年Q1财报一张图解析:营收3.7亿元超预期,用户活跃度创历史新高
- 搜索引擎SEO是什么意思?以下是你需要知道的一切
- 软网推荐:条理分明 请个索引专家
- 落雅墨2020年了,你现在在用什么搜索引擎呢?
- []揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL
- 美好,一直在身边原创图解丨一图读懂“互联网+政务服务”
- 【消费测评世界】百度即将赶下神坛?安逸太久不是好事,字节跳动进军搜索引擎板块