一、索引数据结构
索引是帮助MySQL高效获取数据的排好序的数据结构
二叉树
特点:左子树小于右子树
缺点:如果存储自增数据,二叉树会退化成链表,查询效率低
红黑树
特点:自平衡二叉树,树高相对平衡,不会出现极端情况
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NUIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找
缺点:数据量比较大的时候数高不可控,数据量大的时候查询效率还是不高
B-Tree
*
叶节点具有相同的深度,叶节点的指针为空
*
所有索引元素不重复
*
节点中的数据索引从左到右递增排列
缺点:数据比较大的时候,每行数据不能太多,从而树高还是不可控,影响查询效率
B+Tree(B-Tree变种)
*
非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
*
叶子节点包含所有索引字段
*
叶子节点用指针连接,提高区间访问的性能
HASH表
优点:根据key的hash值存储,准确匹配效率高,时间复杂度是O(1),数据量巨大时也能高效查找
缺点:不支持范围查询,模糊匹配,查找时需要全表扫描
二、 MyISAM引擎(非聚集索引)和InnoDB引擎(聚集索引)
MyISAM存储引擎,索引文件和数据文件是分离的,称之为非聚集索引
先在索引文件中找到数据在磁盘上存储的位置,再去数据文件中根据存储地址找到对应的数据
InnoDB存储引擎,表数据文件本身就是按B+Tree组织的一个索引结构文件,称之为聚集索引
聚集索引叶子节点本身包含了完整的数据记录(主键索引,非主键索引叶子节点存储主键索引)
为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
因为数据文件本身就是按照B+Tree的结构存储的,所以一定要有主键来构建二叉树,如果没有设置主键,系统默认设置rowId作为主键。
使用整形,一是节省存储空间,二是数据比较的效率高,构建索引数快
使用自增是因为叶子节点是从左往右有序递增的,如果后续记录插到中间,B+Tree重新调整,影响性能,如果是递增,索引会直接加在最右边,避免了树结构的调整
为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
1、一致性
新增或者修改数据的时候,所有主键和非主键索引要写入完成时,数据才能算写入完成(为了保证一致性),如果非主键也存储完整数据的话,随着索引的增多,写入性能不高
2、节省存储空间
主键索引上已经保存了完整的数据了,通过B+Tree在主键索引上查询数据性能已经比较高了,没有必要冗余存储多份数据浪费磁盘空间
三、联合索引存储结构
为什么推荐使用联合索引,不使用多个单索引
构建一个二叉树就可以满足搜索,节省存储空间,提高数据写入速度(数据写入时要维护索引)
存储结构
多个字段结合起来作为key,构建B+树的时候,比较字符串的大小来决定存储位置,字符串比较大小是从左往右依次比较的,所以有了索引最左匹配原则