Mysql索引底层数据结构

Mysql索引底层数据结构

问题:
1.数据到底放在哪?
2.有哪些数据结构
3.每个数据结构的优缺点
4.索引和数据结构怎么联系起来
5.索引的最左原则

说透数据

  1. 数据在哪?
    1. 说到底数据都是存放再磁盘里的,所以我们的数据并在磁盘中的位置并不一定是连续的,因为在硬件的角度磁道每次的位置是不一样的。
  2. 为什么说sql要优化,在写代码的时候,要减少库的查询
    1. 每次从磁盘将数据读到内存中,其实都是进行一次磁盘IO,开销是十分大的。如果我读到内存里处理就避免了IO的开销。

数据结构对比

二叉树红黑树B树B+树hash
优点树结构查询快平衡树,在二叉树的基础上进行优化每个节点会划分一块磁盘空间进行分配,所以每个节点会存放多个数据节点,树的高度可以降低1.优化了B树的缺点,除去每个叶子节点的数据数据节点存放着数据,其他所有的节点都只存放一个索引值,2.在叶子节点上增加了双向指针,便于范围查询(同时因为树的每一个节点都是排好序的)理想状态下其实查询最快,一次哈希直接命中的情况
缺点但是当顺序插入递增,树成链表的情况在数据量大的时,树的高度会非常的高每个数据节点的结构(key-索引值,value-一行数据),导致每个节点的所占的空间会比较大,那么树的高度又上来了优秀哈希碰撞;不支持范围查询还是要全表扫描
在mysql选用与否是(但是基本不用)
能存放多少的数据非叶子节点子节点每一页16kb的数据,正常能存放1170条索引,最后的叶子节点是16条,正常计算3层高的B+树就是1170117016 = 2000多万的索引/
mysql中使用的特点1.优化叶子节点的双指针,便于范围查询,2.每一页数据都是按照索引排好序的,3.根据B+树的特点建议我们需要使用整形自增主键(原因见备注1)/

备注

  1. 整型自增原因
    1. 整型原因
      1. 使占用的一页数据中的空间尽量小
      2. 整型类型在数据比较的时候快
    2. 需要自增原因
      1. 首先你不建自增的情况下,mysql会自己选一列不重复的进行索引创建,或者创建一个隐藏列来创建索引
      2. 避免节点进行分裂平衡,如果是自增的B+树会向后开篇空间,放新的索引数据节点
  2. B树和B+树的数据结构
    1. B树在这里插入图片描述

    2. B+树在这里插入图片描述


二级索引

也就是我们平时自己建的索引

主键索引和二级索引结构

二级索引主键索引
数据结构B+树B+树
区别子节点放的value位置放的是主键索引值子节点放的value位置放的是磁盘地址
使用1.拿到对应索引的的主键索引值2.通过主键索引值去主键索引B+树再查到磁盘地址(或者整行数据)直接磁盘地址定位整行数据(innodb)

存储引擎

myisaminnodb
数据结构B+树B+树
存放每个叶子节点的,value位置放的是磁盘地址每个叶子节点的,value位置放的是整行数据(其实这种也叫聚簇索引)
主要区别拿到磁盘地址然后回表查询出数据不用回查了,拿出来就是数据

联合索引

最左原则
就是按照创建索引的顺序构建B+树,如下先排name,再排age。。。

按照构建B+树的特点解释最左原则
如果不是从name开始,没法在树中查询,因为每一个节点都是先从name开始排好序的,如果name都进行搜索的话,一定索引失效。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值