一、索引的本质。
索引是帮助Mysql高效获取数据的排好序的数据结构。
二、索引数据结构的选型。
1.线性结构
1.1 数组。 查询成本低,插入删除成本高。
1.2 链表。 插入删除成本低,查询成本高。
如何综合查询和插入成本?
2.引入树型结构。
2.1 二叉树。
通过二分的形式,插入删除和速度都变快了。
极端情况,如果只是单边增长的数据,结构基本等于链表。
2.2 AVL 二叉查找树。定义,任意节点两个子树的高度最大差别为1
仅理想状态。二叉查找树,了解删除。
删除节点拥有,
双节点时,使用第一个后继节点(第一个大于它的数)
或者使用第一个前继节点(第一个小于 它的树)
2.3 引入红黑树
性质
1.每个节点不是红色就是黑色
2.没有相连的红色节点。每个叶子节点都是黑色的空子节点(NIL)(就是每个看上去的子节点都会补足两个黑色的空节点)
3.根节点是黑色的
4.从根节点,到所有叶子节点所经历的黑节点数目相同。
插入
1.插入节点一定是红色。
开始判断插入节点是否合法。如果插入节点及其父节点都是红色。触发以下逻辑。
1.1变色
父节点和叔节点是红色
父节点和叔节点变黑。
爷爷变红。
判指针指向爷节点。
1.2左旋
如果父节点红,叔节点黑。
点前节点为右子树,则父左旋。
判断指针指向原父节点
p,r
r.p = p.p
r.l = p
p.r = r.l
1.3右旋
如果父节点红,叔节点黑。
点前节点为左子树,父黑,爷红。则爷右旋。
p,l
l.p = p.p
l.r = p
p.l = l.r
大数据的情况下,红黑树高度会很高,
2.4 B树/B+树
每个页节点存放多个数据。
区别:B树的数据,存放在所有节点上。
B+树的数据,不放存在非叶子节点,仅存在子节点。非叶子只冗余存索引。
B+树的叶子拥有双向指针。
2.5 hash.
等值查找很快,但是不适配范围查找。
3.聚集索引,覆盖索引。
检索引擎是基于表的。
innodb
Myisam.主键索引和数据分离。