结构
二叉树
为什么不使用二叉树为索引?
特点:左边的子节点比父节点小,右边的的子节点比父节点大
为什么不使用二叉树为索引?
如果 顺序排列的话 例如 数据自增
select * from t where col1 = 6 ,变成一个链表了,树的高度太深
红黑树
特点:会自动平衡,也是一种二叉树
为什么不用二叉树做索引
只有两个节点,当数据量很大的时候树的高度会很高很高
B树
特点:
a: 叶节点具有相同的深度,叶节点的指针为空
b:所有的索引元素不重复
c: 节点中的数据索引从左到右递增排列
B+树
•非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
•叶子节点包含所有索引字段
•叶子节点用指针连接,提高区间访问的性能
hash 树
•对索引的key进行一次hash计算就可以定位出数据存储的位置
•很多时候Hash索引要比B+ 树索引更高效(一次就可以定位到位置)
•仅能满足 “=”,“IN”,不支持范围查询
•hash冲突问题
存储引擎
MylSAM
MyISAM索引文件和数据文件是分离的(非聚集)
索引和数据分开的都是非聚集索引
InnoDB
•表数据文件本身就是按B+Tree组织的一个索引结构文件
•聚集索引-叶节点包含了完整的数据记录
索引和数据在一起的叫做聚集索引
联合索引
最左前缀原则
面试
为什么不用B树 而要用B+树
B+树
B树
mysql的一个叶子节点大概是16kb,影响mysql的查询是它的高度,当高度为3的时候b+树大约可以存储 (16kb/14)* (16kb/14)* 16
b树大约可以存储(16kb/1kb)(16kb/1kb)(16kb/1kb) ,B+树显然可以存储更多
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
因为在innoDb内部,你没有建立主键的时候,她会判断你每列是否有全部不重复的数据,如果有,将会作为主键,如果没有会建立一个虚拟的,如果我们建立了主键会节省mysql的性能
整型是因为相比较uuid和其他类型,比较大小的会更快
自增是因为在数据插入的时候只需要顺序插入,如果不是自增数据插入的时候输的结构会拆分重建
为什么InnoDB表非主键索引结构叶子节点的存储的是主键的值
保证数据的一致性和节约存储空间,减少一些数据的冗余
单纯从聚集索引和非聚集索引哪个更快
聚集索引