什么是索引?
索引是辅助存储引擎高效获取数据的一种数据结构。
很多人形象的说索引就是数据的目录,便于存储引擎快速的定位数据。
索引的分类
我们经常从以下几个方面对索引进行分类
从 「数据结构的角度」 对索引进行分类
- B+tree
- Hash
- Full-texts 索引
从 「物理存储的角度」 对索引进行分类
- 聚簇索引
- 二级索引(辅助索引)
从 「索引字段特性角度」 分类
- 主键索引
- 唯一索引
- 普通索引
- 前缀索引
从 「组成索引的字段个数角度」 分类
- 单列索引
- 联合索引(复合索引)
数据结构角度看索引
下表是 MySQL 常见的存储引擎 InnoDB,MyISAM 和 Memory 分别支持的索引类型
在实际使用中,InnoDB 作为 MySQL 建表时默认的存储引擎
对上表进行横向查看可以了解到,B+tree 是 MySQL 中被存储引擎采用最多的索引类型。
这里浅尝辄止的谈一下 B+tree 与 Hash 和红黑树的区别。另外,MySQL 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。
B+tree 和 B-tree
B+tree 是 B-Tree 的一个变种。(哦,对了,B-tree 念 B 树,它不叫 B 减树。。。)
B+tree 只在叶子节点存储数据,而 B-tree 非叶子节点也存储数据,对此处有疑问的可以到下面的连接自己插入数据测试一番。
- B-tree :
- B+tree :
因此,B+tree 单个节点的数量更小,在相同的磁盘 IO 下能查询更多的节点。
另外 B+tree 叶子节点采用单链表链接适合 MySQL 中常见的基于范围的顺序检索场景,而 B-tree 无法做到这一点。
B+tree 和红黑树
对于有 N 个叶子节点的 B+tree,搜索复杂度为 「O(logdN) ,d 是指 degree 是指 B+tree 的度」,表示节点允许的最大子节点个数为 d 个,在实际的运用中 d 值是大于 100 的,即使数据达到千万级别时候 B+tree 的高度依然维持在 3-4 左右,保证了 3-4 次磁盘 I/O 就能查到目标数据。