在InnoDB中,索引有三种类型:普通索引、唯一索引、全文索引
索引存储模型推演
二叉查找树
左子树所有节点都小于父节点,右子树所有节点都大于父节点。投射到平面,就是一个有序线性表
优点:快速查找、快速插入
缺点:查找时间和深度相关,最坏的情况下复杂度会退化成O(n),也就是退化成链表
平衡二叉树(AVL树)
因为二叉树深度差距太大,不够平衡。
而平衡二叉树左右子树深度相差不能超过1
通过左旋右旋来保持平衡
可是因为父节点只有左右两个子节点。而InnoDB一页有16KB,一个节点肯定装不满,就需要多次IO查找
深度太大
多路平衡查找树(B树)
路数比关键字多1,可以有多个分叉,减少树的深度
通过分裂合并来保持平衡
如果键有序,可以很快写满一页,然后写另一页。如果键无序,页会频繁分裂
B+树
关键字和路数相等
根节点和枝叶节点不会存储数据,只有叶子节点才存储数据
命中索引也会一直找到叶子节点,保证查询速度稳定
每一个叶子结点增加了一个指向相邻节点的指针,它的最后一个数据会指向下一个节点的第一个数据,形成有序链表
为什么不用红黑树?
红黑树只有两路
红黑树叶子结点为null
不够平衡
什么时候不能用到索引?
索引列上使用函数;表达式计算
字符串不加引号,隐式转换
like条件前面带’%’
负向查询 not in 、!=、not like