深入理解Mysql索引底层数据结构与算法

举报
孙中明 发表于 2022/05/03 00:28:12 2022/05/03
【摘要】 文章目录 索引的数据结构二叉树红黑树Hash表B-TreeB+Tree 表的索引类型MyISAMInnoDB 索引的数据结构 索引是帮助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';

SHOW GLOBAL STATUS like 'Innodb_page_size';

1170x1170x16 = 几千万 只需要 h=3即可

8B+6B(bigint+地址空间大小)


为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

  • 主键

因为数据库再寻址的时候使用的是主键寻址,也就是你主键你如果没有创建的话,数据引擎会自己常见数据表的主键,

方法是使用寻去任意一列没有重复的,作为主键,如果有没有的话,会创建一个隐藏的主键

  • 整型

B+树进行寻址的时候,会进行比较

  1. 比大小,整数比字符或者其他类型比较大小会快;字符也是只是比较长度,然后字符也会进行Ascii(美国信息交换标准代码)进行比较(个人猜测)
  2. 再来,字符所占用的空间大小要比整型大,也就是节省空间省钱(SSD)
  • 自增

如果是自增的时候就直接对数据进行,累加接入到4->5的后面即可,4->5->6,不许动其他的元素


当我不是自增的时候,B+树会进行平衡操作,会改变树的结构例下图,本来4->6的但是再插入5的时候就要对指针重新链接4->5->6


为什么非主键索引结构叶子节点存储的是主键值?

(一致性和节省存储空间)

文章来源: hiszm.blog.csdn.net,作者:孙中明,版权归原作者所有,如需转载,请联系作者。

原文链接:hiszm.blog.csdn.net/article/details/124525156

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。