文章已收录在我的 GitHub 仓库,欢迎Star/fork:
Java-Interview-Tutorial
听说点赞、评论、收藏的人长得都很好看哦。

搜索一个主键id对应的行,先去顶层的索引页88里通过二分查找,定位到你应该去下层哪个索引页里继续找。

若现在定位到下层的索引页35,此时在索引页35里也有一些索引条目,分别都是下层各索引页(20、28、59)及他们里面最小的主键值,此时在索引页35的索引条目里继续二分查找,容易定位到,应该再到下层的索引页里找。

可能从索引页35接着就找到下层的索引页59,此时索引页59里也有索引条目,存放部分数据页页号(如数据页2、8)和每个数据页里最小的主键值。在此继续二分查找,就能定位到应该到哪个数据页里去找。

比如进入数据页2,里面就有个页目录,存放各行数据的主键值和行的实际物理位置。在此继续二分查找,即可快速定位到待搜索主键值对应行的物理位置,然后直接在数据页2里找到那条数据。这就是基于索引去查找主键的过程。

最下层的索引页,都有指针引用数据页,所以索引页之间跟数据页之间有指针连接。索引页内部,同一层级的索引页互相之间也是基于指针组成双向链表:

假设你把索引页和数据页综合起来看,他们都是连接在一起的,从根索引页88开始,一直到所有的数据页,组成了B+树。最底层的一层就是数据页,数据页也就是B+树里的叶节点。

所以,如果B+树索引数据结构里,叶节点就是数据页自己本身,即为聚簇索引!即上图中所有的索引页+数据页组成的B+树就是聚簇索引!

InnoDB下,对数据增删改时,就是直接把你的数据页放在聚簇索引,数据就在聚簇索引里,聚簇索引就包含了数据。比如你插入数据,那就是在数据页里插入数据。

若你的数据页开始进行页分裂,他此时会调整各数据页内部的行数据,保证数据页内的主键值都有序,:

下一个数据页的所有主键值>上一个数据页的所有主键值

页分裂时,也会维护你的上层索引数据结构,在上层索引页里维护你的索引条目,不同的数据页和最小主键值。

然后若你的数据页越来越多,一个索引页放不下了,就会再拉出新的索引页,同时再搞一个上层的索引页,上层索引页里存放的索引条目就是下层索引页页号和最下主键值。

同理可得,若你的数据量越大,此时可能就多出更多索引页层级,不过一般索引页里可以放很多索引条目,即使你是亿级大表,基本上大表里建的索引的层级也就三四层。

聚簇索引默认按主键组织的,所以你在增删改数据时:

  • 会更新数据页
  • 会给你自动维护B+树结构的聚簇索引,给新增和更新索引页,这个聚簇索引是默认就会给你建立

更新数据时,MySQL的聚簇索引是如何变化的?相关推荐

  1. mysql并发_MySQL并发更新数据时的处理方法

    UPDATE是否会加锁? SQL语句为如下时,是否会加锁? UPDATE table1 SET num = num + 1 WHERE id=1; 答案是不会 实际上MySQL是支持给数据行加锁(In ...

  2. oracle更新数据没反应,ORACLE更新数据时如果有就更新没有就插入

    SQL写法: begin update table_name set salary = 10000 where emp_id = 5; if sql%notfound then insert into ...

  3. 向mysql表中插入/更新数据时自动添加创建时间/更新时间

    目录 处理方式一:修改数据库字段类型 测试插入数据: 测试更新数据: 处理方式二:配置生成策略 [MySQL版本] 8.x 处理方式一:修改数据库字段类型 自动添加创建时间: 将字段类型设置为TIME ...

  4. Redis - 更新数据时如何保证MySQL和Redis中的数据一致性?

    文章目录 01.如何理解数据的一致性? 02.使用redis缓存的注意事项? 03.如何更新缓存? 04.组合1:先更新缓存,再更新数据库(双写模式,不推荐) 05.组合2:先删除缓存,再更新数据库( ...

  5. html表格内容自动更新,ElementUI table 组件展开 expand,动态更新数据时,视图没有自动更新...

    这是因为在给table的数据赋值时,展开的视图对应的字段不存在.(动态增加属性) 拿到table数据后,先把展开字段初始化,然后再赋值,问题就解决了~~ 比如,之前是:this.list = api. ...

  6. 更新数据时redis缓存与数据库数据不一致的问题

    最初级的缓存不一致问题及解决方案 问题:先修改数据库,再删除缓存.如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致. 解决思路:先删除缓存,再修改数据库.如果数据库修 ...

  7. C#连接Access数据库,Update更新数据时出现“不能打开数据库,应用程序可能无法识别该数据库。。。”错误

    在使用C#的oledb连接Access数据库时,使用事务来对数据库进行数据增加和修改,前面的insert语句都可以正常执行,而到Update更新表格数据时,程序出现了"不能打开数据库,应用程 ...

  8. sqlserver数据库同步更新数据到mysql数据库,利用ODBC

    项目要求SQLSERVER数据库增加数据的时候同步数据到mysql数据库. 这里用到了存储过程与触发器的混合使用. 因为要同步到MySQL数据库所以首先下载MySQL的ODBC驱动 ↓ https:/ ...

  9. django mysql save_python,django,向mysql更新数据时save()报错不能用

    用户提问 求大神帮忙,models.py中有个Student类,当我用s = Student(...)创建对象,然后s.save()可以往mysql中插入记录,但是当我用 s.name = 'aaa' ...

最新文章

  1. MySQL01-安装mysql数据库
  2. 怎样把HTML文件改成PHP,请问你们怎么将html的文件的内容改变为php
  3. NCBI 下载fna文件 human viral bacteria
  4. 将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...
  5. 【SSM面向CRUD编程专栏 7】springAop 事务控制
  6. 打破AI算力瓶颈,华为升级“智能计算”重塑IT行业
  7. 通过java.net.URLConnection发送HTTP请求
  8. 用Html5制作的一款数学教学程序Function Graphics(绘制函数图的程序)
  9. 玩转动态编译 - 高级篇:三,实例属性的读取与设置
  10. 电脑如何查看x86与arm_电脑关联程序更改 如何更改电脑查看图片的方式
  11. Unity拓展编辑器 一键导出图集工具
  12. AI玩游戏系列,机器学习玩游戏(1) 一维游戏
  13. Java奖学金评定系统设计与实现
  14. 相敬如宾 你将获得更多敬重
  15. 创蓝253云通讯短信平台变量说明
  16. Java面向对象之类和封装
  17. 阿里CTO王坚:商业进化的四个关键词
  18. 阿里云服务器盘镜像备份恢复到本地VMware
  19. Vue Echarts世界地图
  20. Blender基础:从程序员的角度理解顶点组(Vertex Group)和权重(Weight)

热门文章

  1. 基于Three.js的3D简历制作
  2. 不仅仅是建模 6个步骤解析沙盒游戏场景设计
  3. Unity 十三 碰撞条件
  4. flutter drawer (抽屉)
  5. appium locator
  6. 控制字符的转义及英文拼写
  7. 贪心算法-crossing river
  8. 不是发生中断请求的条件_交通部:只需满足3个条件,汽车购置税可以返还,你满足条件吗?...
  9. python中文变量名_如何评价 python 中文变量名?
  10. php 威盾加密解密,仿威盾PHP加密的解密方法