深入理解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)