MySQL索引详解
索引:索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
工作机制:
说到索引就必须提到以下的几种数据结构:
二叉树
1.二叉查找树
缺陷:当数据一边大或者一边小时就会与全局线性链表一样,如:
1 —> 2 —> 3 —>4 —>5,要查找5就必须全部遍历。
2.平衡二叉树
平衡二叉树:满足二叉查找树的定义,另外必须满足任何节点的两个子节点的高度差为1。
缺陷:为了保证数据结构的平衡,会不停地做旋转操作,所以不适合那些频繁变更的列。
二叉树缺陷:
- 搜索效率不足:一般来说,在树结构中数据的深度决定它搜索时的IO次数。
- 节点数据内容太少:每一个磁盘块(节点/页)保存的关键字数据量太少了,无法填充完4K;没有很好的利用操作系统和磁盘的数据交换特性和磁盘预读能力。
Note:操作系统对磁盘的IO操作每页至少交换4K的数据量。
多路查找树
1.B树(多路平衡查找树)
假定每个节点只保存三个关键字的情况:
B树的每个节点数据量为4Kb,加入每个关键字大小为4b,则每个节点可以存放1024个关键字,所以数据库在定义字段长度时尽量保证小且合理,字段越长,导致每个节点可以保存的关键字越少,搜索路数就越少,IO次数就会增加。
插入规则:插入操作,是插入一条记录,即key:value对儿。从叶子节点插入记录,如果需要从下向上调整。
过程:
- 插入记录,根据key的值,找到对应的叶子节点。
- 判断当前节点的key的数量是否<= M-1, true则完成插入,false则继续第三步。
- 把当前节点以中间位置的key为中心,左右的key被“分裂”成两个子节点,中间的key上传到父亲节点中。然后将父节点作为“当前节点”,继续2,3步骤。最坏的情况是一直分裂到root节点,建立一个新的root,整个B树增加一层。
缺陷:每个非叶子节点都包含key值和data值,当data值较大时,每一页存储的key就会减少,相应数据的个数也会减少。针对这一缺陷开发出了B+树。
2.B+树
B+树:加强版多路平衡查找树
B+节点关键字搜索采用左闭右开,非叶子节点只存储关键字和子节点引用,数据存储在叶子节点(相对B树,可以大大增加每一页存储的关键字及其引用的数量)。B+树叶子节点是顺序排序的,并且相邻节点具有顺序引用的关系,使用指针连接。
那么,MySQL为什么使用B+树做索引的数据结构呢?
- B+树是B树的变种,多路绝对平衡查找树,它具有B树的所有优势。
- B+树扫库、表能力更强。(B树因为数据存在节点中,扫库或扫表需要扫过所有的节点,而B+树只需要扫过叶子节点)
- B+树的读写能力更强。因为每个节点只存储关键字和子节点引用,每页可存储更多内容,所以对磁盘的读写能力更强。
- B+树的排序能力更强(叶子节点自带排序)。
Note:B+树的效率不是在所有的情况下都比B树快,例如,查询ID为1,B树可以直接返回,而B+树无论怎样都会走叶子节点。