数据结构演进你能明白为啥要用B+Tree来存储,其中B树已经结合了部分磁盘读取的特性,现在详细讲解,在逻辑上存储数据和在磁盘上存储树的区别,

Mysql.索引数据结构演进_闲猫的博客-CSDN博客

如果有时间请按照顺序浏览,该顺序是思考的顺序更容易接受

1. 大量数据的持久化需要持久化到磁盘上

2. 磁盘读取速度慢,尽量减少IO次数

3. 读取磁盘单位是块,所以数据能放在一块就不放在两块

4. 如果按照树节点结构为Node(data,next),挨个读取数据,那么不同节点最坏的情况是在不同块中,如果读取一个块为16k,只使用其中一个Node数据(8B),是不是很浪费。数据量稍微大一点,树就会很深,那么就得进行多少次IO。

Node类型:

A:ID 用来排序的依据

B:数据域 用来其他数据,对于节点是否存储数据专门讨论,这里暂定是存储数据的

C:Left节点引用:左子树root节点引用

D:Right节点引用:右子树root节点引用

5. 如果每次读取必须读取一个磁盘块(操作系统规定,类似Mysql的存储页),那么只有这个磁盘块都是有用的才没有浪费。数据结构上,就用一个磁盘块对于树中的一个Node,这样势必会存储很多组数据。那么节点数据结构如下:

约定术语:

Node,树节点:指的是上面大方块内容

数据,Data,一条数据:指的是上面ID1+数据域

举例说明:假定一个Node只能存储两个数据,三个引用

场景1查找id=28的用户信息,流程如下: 1. 先找到根节点也就是页1,判断28在键值17和35之间,我们那么我们根据页1中的指针p2找到页3。 2. 将28和页3中的键值相比较,28在26和30之间,我们根据页3中的指针p2找到页8。 3. 将28和页8中的键值相比较,发现有匹配的键值28,键值28对应的用户信息为(28,bv)。

场景2增加100~110节点,为了平衡需要调整树结构;如果是中间增加数据,调整次数会更多

场景3删除<35所有的数据,为了平衡需要调整树结构

规律总结:

  • 每个块存储的节点越多,高度越低
  • 一个固定大小的块(页)存储多少数据,取决于一条数据的大小
  • insert最好根据id大小顺序来插入,否则调整结构会导致insert效率很低
  • 删除数据同样会调整树结构

6. 需求:查找ID为[12,29]的数据,是不是不怎么好读取

  • 问题:根据二叉查找树查找比较简单,读取就不容易了,总的来说是前序遍历,但只输出满足条件的数据,实现逻辑复杂
  • 复杂:子节点没有父节点引用,找不回去,找到12节点和29节点,并不能顺序遍历输出,而是还得遍历全部数据,然后判断是否符合条件,找到容易输出没法子了,这样要索引只能查找单个数据。
  • 但如果子节点存储父节点的引用,就可以从12节点开始:12,根据p3找到13,15,然后找到父节点,12已输出,找12的父节点,输出17,17的左子树……。还是很麻烦
  • 设想:如果存储数据的结构是列表,找到12直接遍历到17不就可以了。很爽是不是,最终的结果就是 列表 + 组合,如下图: 

说明:

  • 树是完全平衡树,叶子节点链起来就是一个链表
  • 每个列表Node是一页,每页中有多条数据,这些数据排序
  • 非叶子节点不在存储数据,只存储用于排序的ID和引用
  • 这样的结构再找[12,29]的数据就好找多了

7.Mysql 索引结构

  1. 默认数据块为16K
  2. Mysql Innodb B+Tree索引,就是上面结构,叶子节点存储数据。
  3. Mysql MyISAM B+Tree索引,类似上面结构,不同的是子节点存储的数据域不是数据,而是地址,需要根据地址再去找完整数据
  4. 类似MyISAM B+Tree索引,Innodb B+Tree非聚集索引 叶子节点存储的是ID值,需要根据ID去聚集索引去找数据
  5. 加入一个节点可以存储1000个键值,那么3层B+树可以存储1000×1000×1000=10亿个数据。一般根节点是常驻内存的,所以一般我们查找10亿数据,只需要2次磁盘IO。

END

Mysql.索引存储结构演进(面试一次搞定)相关推荐

  1. SQL Server 表和索引存储结构

    SQL Server 表和索引存储结构 杜飞 在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结 ...

  2. sql server 索引阐述系列二 索引存储结构

    "流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...

  3. 你以为你懂MySQL索引?阿里的面试官:你还太嫩!

    相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构. 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高.楼主 ...

  4. MySQL索引的理解学习,面试不问索引原理就是事务原理

    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...

  5. mysql聚簇索引存储结构_MySQL聚簇索引的实际应用于结构描述

    以下的文章主要介绍的是高性能的MySQL索引策略之MySQL聚簇索引(Clustered Indexes),我们大家都知道MySQL聚簇索引(Clustered Indexes),在实际应用中比例还是 ...

  6. mysql索引级别快慢_面试小点-MySQL 的两种索引方法如何提高查询速度

    MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度. 索引方法 Mysql 的索引方法有两种,BTERR 和 HASH. 散列表(Hash Tabl ...

  7. #### 联合索引存储结构 ####

    转自 mysql联合索引的数据结构_cristianoxm的博客-CSDN博客_联合索引的数据结构 结构 例如表数据如下: bcd三列组成一个联合索引,在B+树上的结构图: 对于联合索引来说只不过比单 ...

  8. Mysql索引底层结构解析

    从一个实战案例了解索引 我们可以看到这有一个87万的表 没加索引之间执行 SELECT * from t_program WHERE code = '1a5712ef6a864ccca9313aeda ...

  9. MySQL索引页结构

    1. 前言 「页」是InnoDB管理存储空间的基本单位,也是内存和磁盘交互的基本单位.也就是说,哪怕你需要1字节的数据,InnoDB也会读取整个页的数据,下次读取的数据如果恰巧也在这个页里,就能命中缓 ...

最新文章

  1. java中load_java之Properties集合中的方法load
  2. Servlet开发配置
  3. linux node安装
  4. 计组—中央处理器(CPU)
  5. 图像标注技巧_保护互联网上图像的一个简单技巧
  6. pb 执行存储过程带参数_PB级海量数据服务平台架构设计实践
  7. 听云数据库管理平台NetopGO简介
  8. SqlServer数据组织结构
  9. Log Explorer 使用简介转
  10. FreeBSD 8.0候选版本RC2发布
  11. OC语法8——@class关键字
  12. 我的第一个游戏FoodieThebug完成之后的心得体会 -子龙山人
  13. MySQL基础 - 带搜索条件的查询
  14. 北斗导航 | EagleEye2000:国产激光雷达走进测绘世界
  15. Linux 定时器 setitimer
  16. WP7 SDK模拟器对应PC键盘的功能键
  17. 警务系统三维可视化管理与情报研判综合分析平台
  18. CDR中实现浮雕效果的两种方法
  19. 宏碁笔记本关闭安全启动Secure Boot,就是改为Disabled
  20. 数据分析面试题-面试话术

热门文章

  1. 【CSS3】一文搞懂盒子模型(知识点加案例)
  2. 篆刻小站之设计与开发
  3. linux系统mysql密码忘记了怎么办_Linux中MySQL密码忘了怎么办
  4. Linux 系统管理 : w 命令详解
  5. Hibernate第五篇【inverse、cascade属性详解】
  6. 数据结构之寻找下标和相等的数字方阵
  7. ESP-8266接入阿里云开关LED
  8. html实现凹陷效果,css3怎么实现字体凹陷凸出效果?(附代码)
  9. 计算机手动配置信息,手动修改并设置电脑开机画面入您所愿
  10. 最新总裁导航系统PHP网站源码+开源版