一、索引类型
MySQL索引是一种特殊的数据结构,InnoDB的索引是表空间的一部分。索引保存着涉及所有记录的引用指针。按索引字段特性角度分类:
1、普通索引(index)
2、唯一索引
主键索引(primary key)
唯一索引(unique)
3、联合索引
联合主键索引:primary key(id, name, age)
联合唯一索引:unique(id, name)
联合索引:index(id,name,age)
三、B+Tree索引和Hash索引
按索引数据类型分类,可以分为B+Tree索引、Hash索引、full-texts索引。
* Innodb从5.6开始支持全文索引。
1. B+Tree索引
B+Tree由二叉查找树、平衡二叉树、B树演变而来。
★二叉查找树
如图所示,二叉查找树的节点存的是键值(key,索引字段的实际值)和数据(data,数据行)。
二叉树的特点:左子树的值<当前节点的值<右子树的值。顶端节点为根节点,没有子节点的节点为叶子节点。
如果要查id(索引字段)为12的数据,步骤如下:
1. 根节点id与12比较,10<12,选择右子树为当前节点;
2. 13>12,选择左子树为当前节点;
3. 12=12,取出索引中的data。
时间复杂度:
第1次折半:还剩n/2个元素
第2次折半:还剩n/4个元素
第3次折半:还剩n/8个元素
……
第k次折半:还剩n/2^k个元素
最坏的情况下,查到最后还剩1个元素才查出来,即n/2^k = 1。得k=logn。所以二叉树的时间复杂度为O(logn)。
★平衡二叉树
二叉树是可能退化成链表的,如下图。
如果要查id为17的用户,需要遍历所有节点,等效于全表扫描。
造成二叉树退化的原因是,结构不平衡,二叉树高度不稳定,从而导致查找效率不稳定。为了保证二叉树保持平衡,就要用平衡二叉树。
平衡二叉树又称AVL树,要求左右节点高度差不能超过1。
当插入或者删除导致平衡二叉树不平衡的时候,它会调整结构来保持平衡。调整的方式为旋转节点位置。
平衡二叉树相比二叉树,查询效率更稳定,速度更快。但是保持平衡的旋转调整会消耗很多资源。平衡二叉树可以优化为红黑树。
★B树(Balance Tree)
MySql将数据和索引都存在磁盘中,相较于内存&#