MySQL学习(三)

索引结构

我们都知道MySQL innodb myisam 都得索引结构是用的b+tree 来实现的,但是我们为什么不适用hash表来实现呢?

hash表在单独取出数据的时候非常快速,但是不支持范围查找 举个例子来说

你存放进去一个数据 根据hash在某个位置,下一次取出的时候,可以直接取出来.但是不能对这个数据进行一个范围查找,因为hash是散列存放的

为什么不用平衡二叉树?

拒教程讲的是找一次需要进行一次磁盘IO?我有点不懂,为什么不直接全部加载然后一次Io就可以了

B树:

一个节点可以放置多个节点,这里可以设置度的概念.树的深度比二叉树低.简而言之减少磁盘IO

同2-3树的性质是一样的这里我就不贴图了

B+树

b+树查找为什么快https://blog.csdn.net/samll_snail/article/details/89445749#commentBox

B+树的叶子节点冗余非页子节点.可以利用树结构的快速查找,比如查找大于0003的数据,那么利用树结构找到0003 然后找到叶子叶子节点的链表,从而找到之后的数据

要理解索引是如何加载的,首先了解磁盘IO的本质

机械硬盘

 

固态硬盘

本质的区别.机械硬盘 使用机械来读取, 固态硬盘,用的是电路板

机械硬盘读取的时候先获取一个读取的名称然后寻道->找到扇区

计算机局部性原理和磁盘预读

计算机中著名的局部性原理:当一个数据被用到的时候,其附近的数据也会马上被使用

为了提高效率,磁盘不会严格的按需读取,而是每次都会预读,即使读取一个字节,磁盘也会从这个位置顺序的往后读取一定的长度数据放入内存!

这里的一定长度叫做页,也是操作系统读取磁盘的基本单位.

一般操作系统都是的页是4kb的大小 getconf PAGE_SIZE

总结:

b树或者b+树 正好是页单位的倍数比较好

B+树在innodb中的存储是直接在叶子节点存的数据在其他索引是存的数据的地址

 在innodb中数据基本单位也是页 大小是16kb,在b+树中一个树节点也是一页

在B+树中假设 一行是1kb的话一页是16kb一页就是存16条数据,叶子节点就是存储数据,一个叶子节点可以存16条数据

非叶子节点 只存指针和key

假设bigint(8)和指针(6b)

 

转载于:https://www.cnblogs.com/bj-xiaodao/p/10989930.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值