一、索引是什么
索引是帮助mysql高效获取数据的排好序的数据结构,方便快速检索需要的数据。
二 索引是如何提升数据检索的
[示意图]
假如查找 select t.* from table t where t.col2 = 12
如果没有索引的情况,则Mysql默认会逐行扫描,直到全部扫完,并比对,找出所有col2等于10的记录。此处扫描了7
次。
ps: 数据储存在磁盘中,是散列分布的,通过磁盘地址去找寻数据,所以每扫描一行都会进行一次I/O,I/O是特别耗时的。
- 如果从索引树中去找,则只需要拿12去比对,从根节点开始,比10大,则从右边节点查找,比14小,则从左边节点查找。此处只需要扫描
3
次。
三、常见的索引数据结构
1. 二叉树
1.1 二叉树结构图示
[二叉树结构图]
为什么mysql不选择二叉树做索引数据结构。
二叉树单边增长情况
[单边增长图]
2.二叉平衡树(红黑树)
[红黑树结构图]
红黑树会自我平衡,也就是满足节点必须为2叉,所以叫二叉平衡树。
ps:如果数据量巨大,超过500W呢, 红黑树的高度是不可控的,则树的高度会非常高,这样检索效率会大大下降。
3. B树(多叉平衡树)
[B树结构图]
B树: 1.叶节点具有相同的密度,叶节点的指针为空。 2.所有索引元素不重复。 3.节点中的数据索引从左到右递增排列
4.B+树
[B+树结构图]
B+树: 非叶子节点不存储data,只存储索引(冗余),这样就可以放更多的索引元素 叶子节点包含所有的索引字段 叶子节点之间用指针链接,提高区间访问的性能 叶子节点可以看做是一个环形的双向有序链表。 所有的节点都是排好序的结构,可利用二分法查找快速定位到查找的指针地址
5.mysql为什么用B+树做默认索引结构,而不是B树?
1.在B树中,每个节点都包含了键值和数据的信息,由于节点是存在磁盘中,每个节点的大小设置固定值。由于数据的存在,节点存储索引键值就会变得小很多。这样在查找一个数据时,需要加载一个节点,下一个节点的查找。这样加载的节点就会变相增加,而一次I/O比较耗时。 而B+树中,只有叶子节点才储存数据,非叶子节点可以存储更多的索引键值,这样加载节点就会变少。I/O次数相应也会变少。减少了I/O的开销。 简而言之:B+树比B树具有更好的磁盘读写性能。
2.B树中,叶子节点之间没有指针指向,在范围查询时,需要在内部节点中进行额外的搜索和遍历操作,效率相对较低。 B+树的叶子节点形成了一个有序的链表,可以很方便的进行范围查询。 简而言之:B+树在范围查询方面具有优势。
3.由于B+树只在叶子节点存储数据,内部节点不存储实际的数据,因此可以容纳更多的键值对在同样大小的内存空间中,减少了内存的占用。