mysql详解之innoDB
索引
Mysql由索引组织,所以索引是mysql多重要概念之一。
聚簇索引
InnoDB和MyISAm一样都是采用B+树结构,但不同点在于InnoDB是聚簇索引(或聚集索引),将数据行直接放在叶子节点后面。
这里可能存在一个误区:觉得MyISAm是B树。innoDB采用了B+树,将数据存在了叶子节点上。
这个逻辑是不对的。这两个存储引擎都采用的B+树,只是叶子节点上存的数据不一样。MyISAm存的是一个地址,而innoDB存的一整行数据。
聚簇索引是innoDB的主键索引的实现方式。如果没有设置主键呢?难道就没有聚簇索引了?当然不会了,你不创建,innoDB会帮你找一个:
-
首先看看是不是有唯一索引,如果有的话,那么第一个唯一索引就是聚簇索引
-
如果唯一索引也没有,表结构中还藏了一个隐藏字段(DB_ROW_ID)作为聚簇索引字段。
如图所示:
辅助索引(二级索引)
非聚簇索引都是辅助索引,包括唯一索引,普通索引,组合索引。
之所以叫辅助索引,是因为一般情况下都需要“回表”,最终还是要靠聚簇索引查出数据。
select * from tab where name = 'a';
如图
索引分裂
当新增/修改索引数据时,索引块空间不够,分裂出一个新的索引块过程成为索引分裂。分裂方式方式包括:
1-9分裂:传统分裂方式。一块索引写完,加一块新的,上一个索引块数据尽量不动。适合索引自增长,事务并发比较低的情况。但可能引起索引块层级突然升高多层的问题。
5-5分裂:新增索引块时,把上一个索引块一半的数据分到新索引块中。保证了增加了B+树层级的稳定性(避免增加一个索引块,增加两层以上的情况)。适合随机索引数据,事务并发高的情况。但会引起索引的空间利用率不高的问题。
buffer poor(缓冲池)
数据库的读操作,并不是直接从磁盘读取数据。而是首先在buffer poor里找,如果有就直接返回,没有再去磁盘获取,放在buffer poor里,然后返回。听起来像缓存,但其实不是。
mysql缓存是[sql语句-查询结果]的key-value数据(由于命中效率不高,在mysql8就去掉了这块功能),属于mysql的server层。
buffer poor里单纯是数据,是存储引擎的一部分。
数据库的写操作,并不是直接改的磁盘文件,而是拿到缓冲池操作。从这个角度,缓冲池起到一个工作空间的作用。修改过的数据页称为脏数据页。等待被刷到磁盘(在刷到磁盘之前先写到redo log中)。
可以通过调整 innodb_buffer_pool_size
参数来设置 Buffer Pool 的大小。
表空间
表空间(tablespace)是mysql数据在磁盘上的存储形式。或者说是.ibd文件的数据格式。表空间的逻辑,从大到小依次可拆分为:段(segment),区(extent),页(page),行(Row)。如下图所示
一般把页作为基本单位。
事务
innoDB为实现事务,引入了一系列技术,同时也带来了很多问题,为解决这些问题,又引入更多新技术。
所以mysql没有一开始就给自己默认存储引擎加入事务,也是可以理解的。
事务四大特性:
如图所示
锁
Mysql是一个多线程系统,要实现事务,保证数据库的一致性,锁是必要的技术。
日志
redo log
redo log称为重做日志,用于记录事务操作。以便在服务重启后,通过前滚操作,恢复数据。保证事务在服务正常/异常重启的情况下依然能保障原子性。
有些文章会这么做比喻:
redo log可以理解为饭店里的小黑板。饭店允许客人记账赊账。当就餐人太多时,就先把钱记到小黑板上。这样就不用在忙的焦头烂额时还去翻账本,去记账算账了。
或者
redo log 就像快递代收点,往一家一家送快递,太慢,先统一摆到代收点。有时间再往用户家里送。
从某种程度上说,这么比喻也没问题。但可能会让人产生误解:redo log在起“缓冲”作用?那么下一步是不是:把数据从redo log再往数据文件挪?
如果你这么想,那就可能就被误导了。
redo log和数据写入数据库表文件。正常情况下,两者并没有很强的关联性。你写你的日志,我写我的数据。只有当服务异常重启(断电/服务宕机),redo log才开始起作用。为数据库恢复缺失的数据。如图所示
上图中,左边是redo log buffer写到磁盘日志文件的过程。右边是buffer poor写入磁盘数据库文件的过程。左右两边在正常情况下,并没有什么交集。恢复过程是服务重启时才会起作用。
当然,但也不是完全没关联。redo log在正常情况下并不完全只会无脑记日志。它还起到一个很重要的作用:纪录完后,作为事务完成的标志。有时候甚至会说:日志比数据更重要。
顺序io:由于日志的顺序io的特性,redo log可以实现快速的落盘操作(相比右边的数据落盘要快的多,因为右边要处理复杂的数据结构,写磁盘相当于一种随机io)。
前面说的两个比喻,其实想表达的就是这层意思。
上图中,直接从log buffer 刷到了磁盘。实际操作中其实中间还有一层OS Buffer(操作系统的内核空间),如图所示
注意看这个图,虽然也是两条路,但是redo log和 undo log。其实看到这里就会明白一件事:无论是redo log,undo log还是buffer pool里的数据都需要经过 buffer(用户空间) --> os buffer(操作系统内核空间) --> file(磁盘文件)
这里涉及到一个配置参数innodb_flush_log_at_trx_commit
这个值表示三种从内核刷到磁盘的刷盘策略:
1:【默认】事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
0:事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
2:每次提交都仅写入到os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。
在《Mysql技术内幕》里,作者做了一个实验50万数据的插入测试,配置从1改为0,时间从113秒 缩短到了 13.9秒,近10倍的速度差距,还是很可观的。如果业务以写数据为主(如状态监控系统),并发量不是很大,不在乎可能丢失1秒到数据,我个人认为调为0就行。
前面我们看到有两个redo log日志(ib_logfile0, ib_logfile1),其实以后也不会再增加了。因为redo log是循环写数据。新数据会把最老的数据逐渐覆盖。这个日志本来就是为了拯救系统宕机前最后一批事务。而是不是用来恢复长期数据的。
与之对应的时binlog,有人叫它二进制日志,这纯粹是直译。其实redo log,binlog,undo log 都不是纯文本日志。有人称之为”归档日志“,这个在意思上就很贴切。
redo log和binlog的同步
redo log是innoDB用来保障数据完整性的日志。binlog是Mysql自带的日志,除了可以用来恢复数据,还用于集群之间的数据同步。所以这两者必须保证一致性。否则数据库集群之间的数据就不一致了。innoDB采用了2阶段提交机制:
先把redo log写完,但不改状态。再去写binlog,等binlog写完,再改状态。
实际生产中,在1~6处都可能出现中断。前四处中断都无所谓,二者都可以保持”未提交“状态。但问题是如果在5或者6处中断就有问题了。此时binlog完全可能已经把数据同步给集群的其他数据库了。但redo log却还是prepare状态。这就会导致本机和其他服务器数据不一致。因为2pc在理论上就无法实现一致性。
但好在日志是可以自我校验完整性的,无论是redo log还是binlog都可以。
所以当服务再次重启,redo log着手恢复数据时,如果发现最后一个事物的状态是”prepare“状态。它并不会马上把该事务数据删掉,而是要再去binlog那里看看。如果binglog的这个事务是完整的,那么就可以判断应该就是刚好在5或6的位置中断的。则把事务数据恢复后状态改为commit,这样本机和其他服务器数据就一致了。实现了弥补2pc逻辑漏洞的问题。
当然,由于5,6时间极短。6这一步,只是改一改状态,几乎不费什么时间。前面大家都把事情干完了,最后只是为了一起确认个状态。这也是为什么2pc机制即便存在逻辑漏洞,但依然被使用的原因。
redo log还有一个特性需要强调的是,它是物理日志。经常会以此和undo log一起说,或者跟binlog做对比。因为undo log和binlog都是逻辑日志。具体见博客mysql详解之redolog的关键——幂等性
redo log所在位置(mac系统的目录)
undo log
被称为回滚日志。可以在事务出现异常(非服务或服务器异常)时进行回滚操作。也就是程序正常的回滚操作。
和redo log的物理日志不同,undo log是逻辑日志。可以简单理解为sql语句。
当用户执行了insert语句,那么就会生成delete的undo log日志。当用户执行了a --> b的updte语句,那么就会生成一个b --> a的undo log日志。
undo log和redo log 共同实现了:无论是日常事务回滚还是服务重启,都可以自动保障事务的原子性。
undo log的第二大作用在是MVCC机制中实现多版本控制。MVCC中多个版本的数据,其实只有一个版本。修改就是在原数据上改的(都是buffer pool里的操作)。之所以看起来还能查到“历史版本”。不是保留了历史版本,而是通过undo log回退计算获得的历史版本。
另外,undo log也会产生redo log,因为undo log也要实现持久性保护。
undo log默认和redo log存放在一起,也可以通过配置改为和表文件存放在一起。
参考
深入理解MySQL重做日志 redo log
MySQL事务日志(redo log和undo log)的详细分析【非常全面】
B树索引是怎么分裂的
Mysql buffer pool详解
答应我,这次要搞懂 Buffer Pool
MySQL的表空间是什么
为什么MySQL 删除表数据 磁盘空间还一直被占用
mysql深入浅出之日志(redolog, binlog, undolog)
相关文章:
mysql详解之innoDB
索引 Mysql由索引组织,所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构,但不同点在于InnoDB是聚簇索引(或聚集索引),将数据行直接放在叶子节点后面。 这里可能存在一个误区࿱…...
电信运营商的新尝试:探索非通信领域的发展
近年来,随着电信运营商竞争的日趋激烈和网络建设的成本不断攀升,许多电信运营商已经开始缩减IT投资。然而,在如此情况下,电信运营商仍然需要寻找新的增长机会。那么,在持续缩减IT投资的情况下,电信运营商可…...
第07章_单行函数
第07章_单行函数 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经…...
Echarts实现多柱状图重叠重叠效果
有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低,而且不会…...
PHP学习笔记(一谦四益)
前言 上一篇文章 PHP学习笔记(观隅反三)分享了数组的知识,这篇文章接着分享和数组相关的算法。 算法效率 算法效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称…...
Jvm -堆对象的划分
堆对于一个jvm进程来说是唯一的,一个进程只有一个jvm,但是进程半酣多个线程,多个线程共享一个堆。 也就是说,一个jvm实例只存在一个堆,同时对也是Java内存管理的核心区域。 Java堆区域的大小在jvm启动时就已经被确定…...
2023美赛F题讲解+数据领取
我们给大家准备了F题的数据,免费领取!在文末 国内生产总值(GDP)可以说是一个国家经济健康状况最著名和最常用的指标之--。它通常用于确定一个国家的购买力和获得贷款的机会,为各国提出提高GDP的政策和项目提供动力。GDP“衡量一个国家在给定时间段内生产…...
【博客625】keepalived开启garp refresh的重要性
keepalived开启garp refresh的重要性 1、场景 1-1、对keepavlied master机器热迁移后出现vip不通,过后恢复 原因:机器迁移后网关那边的arp表没有刷新,流量还是转发到老的端口,但是机器已经迁移到别的端口了,于是网络…...
nginx防护规则,拦截非法字符,防止SQL注入、防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇
nginx防护规则,拦截非法字符,防止SQL注入、防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇 精心强化,小白一键复制 资源宝分享:www.httple.net 宝塔为例:/www/server/panel/vhost/nginx/你的网站域名.conf,复制代码点击保存 修改www.xx.net你自己域名incl…...
【计算机网络】网络层
文章目录网络层概述网络层提供的两种服务IPv4地址IPv4地址概述分类编址的IPv4地址划分子网的IPv4地址无分类编址的IPv4地址IPv4地址的应用规划IP数据报的发送和转发过程静态路由配置及其可能产生的路由环路问题路由选择路由选择协议概述路由信息协议RIP的基本工作原理开放最短路…...
产品经理知识体系:1.什么是互联网思维?
互联网思维 思考 笔记 用户思维 是要注重用户体验,产品带给用户的价值是什么,是能帮助用户获取想要的商品、解决生活中的问题、获取想要的信息,还是产品能通过兜售参与感、满足感等来满足用户的心理需求。 贯穿产品的整个生命周期过程。 简…...
【数据结构】单链表的接口实现(附图解和源码)
单链表的接口实现(附图解和源码) 文章目录单链表的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.开辟新空间2.头插数据3.头删数据4.打印整个单链表5.尾删数据6.查找单链表中的数据7…...
TikTok话题量超30亿,这款承载美好记忆的剪贴簿引发讨论
回忆风剪贴簿在TikTok引起关注小超在浏览超店有数后台时发现,有一款平平无奇的剪贴簿的种草视频爆火,在24h内收获了9.9K点赞,播放量更是突破了100W,直接冲到了【种草视频飙升榜】第六名的位置,并且这个数字目前仍在继续…...
了解Dubbo
1.注册中心挂了,消费者还能不能调用生产者? 注册中心挂了, 消费者依然可以调用生产者。生产者和消费者都会在本地缓存注册中心的服务列表,当注册中心宕机时,消费者会读取本地的缓存数据,直接访问生产者&am…...
2023年前端面试知识点总结(JavaScript篇)
近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正! 1. JavaScript有哪些数据类型 总共有8种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt Null 代表的含义是空对象…...
jQuery
文章目录jQuery 介绍初体验核心函数jQuery 对象和 dom 对象区分什么是 jQuery 对象,什么是 dom 对象问题:jQuery 对象的本质是什么?jQuery 对象和 Dom 对象使用区别Dom 对象和 jQuery 对象互转(重点)jQuery 选择器&…...
强化学习基础概念
强化学习入门 入门学习第一周:基础概念 经验回放: 将sss,agent当前步的action环与境的交互rrr以及下一步的状态st1s_{t1}st1组成的四元组[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxhVd0dn-1676710992983)(null)] 组…...
Redis学习【9】之Redis RDB持久化
文章目录一 AOF(Append Only File) 持久化二 AOF 基础配置2.1 AOF的开启2.2 文件名配置2.3 混合式持久化开启2.4 AOF 文件目录配置三 AOF 文件格式3.1 Redis 协议3.2 查看 AOF 文件3.3 清单文件3.4 Rewrite 机制3.4.1 rewrite简介3.4.2 rewrite 计算策略3.4.3 手动开启 rewrite…...
分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊
2022年11月23日首发于掘金,现在同步到公众号。11. 前言大家好,我是若川。推荐点右上方蓝字若川视野把我的公众号设为星标。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推…...
事件驱动型架构
事件驱动型架构是一种软件设计模式,其中微服务会对状态变化(称为“事件”)作出反应。事件可以携带状态(例如商品价格或收货地址),或者事件也可以是标识符(例如,订单送达或发货通知&a…...
20222023华为OD机试 - 不含 101 的数(Python)
不含 101 的数 题目 小明在学习二进制时,发现了一类不含 101 的数, 也就是将数字用二进制表示,不能出现 101 。 现在给定一个正整数区间 [l,r],请问这个区间内包含了多少个不含 101 的数? 输入 输入一行,包含两个正整数 l l l, r r r...
杭州电子科技大学2023年MBA招生考试成绩查询和复查申请的通知
根据往年的情况,2023杭州电子大学MBA考试初试成绩可能将于2月21日公布,最早于20号出来,为了广大考生可以及时查询到自己的分数,杭州达立易考教育为大家汇总了信息。根据教育部和浙江省教育考试院关于硕士研究生招生考试工作的统一…...
电子技术——CS和CE放大器的高频响应
电子技术——CS和CE放大器的高频响应 在绘制出MOS和BJT的高频响应模型之后,我们对MOS和BJT的高频响应有了进一步的认识。现在我们想知道的是在高频响应中 fHf_HfH 的关系。 高频响应分析对电容耦合还是直接耦合都是适用的,因为在电容耦合中高频模式下…...
2023年数学建模美赛D题(Prioritizing the UN Sustainability Goals):SDGs 优先事项的选择
正在写,不断更新,别着急。。。 4. SDGs 优先事项的选择 4.1 基于SDG密度分布图选择优先事项 虽然每个可持续发展目标的接近度矩阵和中心性度量的结果是通用的,并创建了基本的可持续发展目标网络,但由于各国在网络的不同部分取得…...
springboot实现项目启动前的一些操作
在服务启动时,做一些操作,比如加载配置,初始化数据,请求其他服务的接口等。 有三种方法: 第一种是实现CommandLineRunner接口 第二种是实现ApplicationRunner接口 第三种是使用注解:PostConstruct 三者使用…...
详解JavaScript的形参,实参以及传参
文章目录 前言一、参数是什么?二、形参和实参 1.形参 2.实参三、传参 1.参数传递的对应关系2.两个传参的例子 总结前言 编程初学者在接触JavaScript这门语言时,很难搞懂里面的逻辑,这就会导致入门慢,入门难。这种难度一般…...
Vue中的diff算法
diff算法介绍 diff算法是一种高效对比算法。diff算法在组件更新即响应式数据监控到数据的改变,重新生成虚拟DOM树的时候调用,然后通过diff算法计算出前后虚拟dom树的差异点,更新dom时只更新变化的部分。 直接比较和修改两个数的复杂度为什么…...
【面试题】前端春招第二面
不容错过的一些面试题小细节,话不多说,直接看题~大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库HTML/CSS/Javascript/ES篇(1)标准盒模型和怪异盒…...
Pytorch 基础之张量数据类型
学习之前:先了解 Tensor(张量) 官方文档的解释是: 张量如同数组和矩阵一样, 是一种特殊的数据结构。在PyTorch中, 神经网络的输入、输出以及网络的参数等数据, 都是使用张量来进行描述。 说白了就是一种数据结构 基本数据类型…...
Java 基础面试题——常见类
目录1.String 为什么是不可变的?2.字符串拼接用“” 和 StringBuilder 有什么区别?3.String、StringBuffer 和 StringBuilder 的区别是什么?4.String 中的 equals() 和 Object 中的 equals() 有何区别?5.Object 类有哪些常用的方法?6.如何获…...
爱站网是干嘛的/短视频培训要多少学费
摘抄整合,勿喷 GDB r:run,执行程序 n:next,下一步,不进入函数 s:step,下一步,会进入函数 b:breakponit,设置断点 l:listÿ…...
商城网站设计价格/2023b站推广大全
概览在 iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看到iOS中如何使用图层精简非交互 式绘图,如何通过核心动画创建基础动画、关键帧动画、动画组、转场动画,如何通…...
学前心理学课程建设网站/做推广的都是怎么推
这个网站是真免费的那种,不是打着免费的旗号让你付费的套路。 我准备更换公司的bug管理系统,找了半天,找到这个网站最符合我的心意,流程简洁,用起来方便,速度快。 有兴趣的去看看吧: buginfo…...
招商网站建设解决方案/怎样在百度打广告
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式,借助lambda表达式,我们可以编写出性能更好,可读性更强的代码,更重要的,它给我们带来了一种…...
机wordpress/外链群发
目录qq邮箱前往邮箱的设置->帐号开启IMAP/SMTP服务安全验证得到授权码163邮箱前往邮箱的设置->POP3/SMTP/IMAP开启smtp服务安全验证得到授权码总结『杂记』分享一些实用的技巧方法 安装环境,配置环境教程,推荐实用软件 软件的使用问题。 欢迎关注 …...
做企业官网需要多少钱/seo营销技巧培训班
小练习,小练习哈,直接上代码,上课上的太无聊了,来玩一玩vue来了~ <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"…...