mysql索引存储结构

索引

帮助MySQL高效获取数据的排好序数据结构;

常见的索引结构

  • 二叉树
  • 红黑树
  • hash
  • b-tree
  • b+tree索引真正使用的数据结构

二叉树

缺点:一个节点只有两个子节点,当数据量很大时,树的深度很大,要进行多次查询,而且容易造成两边不平衡。

红黑树

优点:解决了二叉树不平衡的问题。
缺点:当数据量很大时 ,树的深度还是很高。

hash

缺点:不能进行范围查找。

b-tree

度(degree)- 节点的数据存储个数
叶节点具有相同的深度
节点中的数据key从左到右递增排列
优点:因为度可以让一个节点存储多个数据,所以大大降低了树的深度。
那是不是度越大越好呢?
答案:不是,当使用索引时,会把树的节点数据从索引文件中读取到内存中,这个读取大小的单位和计算机有关,不过一定是页(一般一页是4k)的整数倍,如果一个节点的数据太大,就会多次向内存中加载数据,也就是进行多次IO操作,这是非常耗性能的。

b+树

和b树不同的是:

  1. b+树非叶子节点中的数据是只存储key,不存储数据,单个数据节点的大小减小,可以把树的度设置的更大,从而减少查询次数,提高查询速度。
  2. b+树叶子节点存储key和value,从左到右升序排列,并且以指针相连,大大提高了范围内查找的速度和效率。

索引实现

存储引擎是设置在表级别的

Myisam索引实现(非聚集)

  • Myisam索引文件和数据文件分离
    在MySQL的data/mysql/目录下一般一张表有三个文件:
    .frm:表结构文件
    .myd:数据文件
    .myi:索引文件
  • 索引文件叶子节点中value是数据在数据文件中的地址
  • 主键索引与非主键索引存储方式相同

InnoDB索引实现(聚集)

  • InnoDB索引文件和数据文件放在一起
    在MySQL的data/mysql/目录下一般一张表有二个文件:
    .frm:表结构文件
    .idb:索引文件和数据
  • InnoDB必须有主键,推荐是自增类型。如果没有主键会自动从列中选一个列作为主键,如果都不符合做主键的条件,则InnoDB会为该表创建一个主键。
  • 主键索引中value是数据(可以理解为一条记录)
  • 非主键索引中value是主键索引中的主键。
  • 为什么非主键索引不和主键索引一样value中放置数据呢?
    这就和事务有关了,如果value中都存储数据,则进行更新和插入数据时,这两个索引结构都要改变,而且还要实现事务的ACID特征,不易实现,效率也不高。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值