深入理解Mysql索引底层数据结构与算法
索引的数据结构
索引是帮助MySQL高效获取数据的排好序的数据结构
常见的索引数据结构
- 二叉树
- 红黑树
- Hash表
- B-Tree
- B+Tree
二叉树
红黑树
Hash表
- 对索引的key进行一次hash计算就可以定位出数据存储的位置
- 很多时候Hash索引要比B+ 树索引更高效
- 仅能满足 “=”,“IN”,不支持范围查询
- hash冲突问题
B-Tree
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
B+Tree
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
高度
表的索引类型
MyISAM
myisam
在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。
.frm
用于存储表的定义
.MYD
用于存放数据
.MYI
用于存放表索引(存放的是物理地址) 找到索引后需要再进行一次内存寻址(非聚集)
InnoDB
表数据文件本身就是按B+Tree组织的一个索引结构文件
聚集索引-叶节点包含了完整的数据记录
.frm
用于存储表的定义
.idb
用于存放表索引+数据(聚集)
叶子指针=区间查找
例如50>col>20
;分页优化
SHOW GLOBAL STATUS like 'Innodb_page_size';
1170x1170x16 = 几千万 只需要 h=3即可
8B+6B(bigint+地址空间大小)
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
- 主键
因为数据库再寻址的时候使用的是主键寻址,也就是你主键你如果没有创建的话,数据引擎会自己常见数据表的主键,
方法是使用寻去任意一列没有重复的,作为主键,如果有没有的话,会创建一个隐藏的主键
- 整型
B+树进行寻址的时候,会进行比较
- 比大小,整数比字符或者其他类型比较大小会快;字符也是只是比较长度,然后字符也会进行Ascii(美国信息交换标准代码)进行比较(个人猜测)
- 再来,字符所占用的空间大小要比整型大,也就是节省空间省钱(SSD)
- 自增
如果是自增的时候就直接对数据进行,累加接入到4->5
的后面即可,4->5->6
,不许动其他的元素
当我不是自增的时候,B+树会进行平衡操作,会改变树的结构例下图,本来4->6
的但是再插入5的时候就要对指针重新链接4->5->6
为什么非主键索引结构叶子节点存储的是主键值?
(一致性和节省存储空间)
文章来源: hiszm.blog.csdn.net,作者:孙中明,版权归原作者所有,如需转载,请联系作者。
原文链接:hiszm.blog.csdn.net/article/details/124525156
- 点赞
- 收藏
- 关注作者
评论(0)