一共48讲,学习时间2天。

开篇词 (1讲)

理论指导实践:先系统性的学习原理,再实践验证。
你可以从点到线再到面,形成自己到mysql知识网络。
在使用mysql时心里有底,知道怎么选择并且明白为什么。
了解原理,才能在实践中不断创新,提升个人到价值和工作输出。
 
 
 
 

基础篇 (8讲)

不要使用缓存,query_cache_type设置成DEMAND,这样默认不使用查询缓存。
要使用查询缓存的语句,用SQL_CACHE显示指定:select SQL_CACHE * from T where id = 10;
MYSQL8.0开始删除了查询缓存功能。
慢查询日志中的rows_examined字段,表示这个语句执行过程中扫描了多少行
 
1.⾸先客户端通过tcp/ip发送⼀条sql语句到server层的SQL interface 2.SQL interface接到该请求后,先对该条语句进⾏解析,验证权限是否匹配 3.验证通过以后,分析器会对该语句分析,是否语法有错误等 4.接下来是优化器器⽣成相应的执⾏计划,选择最优的执⾏计划 5.之后会是执⾏器根据执⾏计划执⾏这条语句。在这⼀步会去open table,如果该table上有MDL,则等待。 如果没有,则加在该表上加短暂的MDL(S) (如果opend_table太⼤,表明open_table_cache太⼩。需要不停的去打开frm⽂件) 6.进⼊到引擎层,⾸先会去innodb_buffer_pool⾥的data dictionary(元数据信息)得到表信息 7.通过元数据信息,去lock info⾥查出是否会有相关的锁信息,并把这条update语句需要的 锁信息写⼊到lock info⾥(锁这⾥还有待补充) 8.然后涉及到的⽼数据通过快照的⽅式存储到innodb_buffer_pool⾥的undo page⾥,并且记录undo log修改的redo (如果data page⾥有就直接载⼊到undo page⾥,如果没有,则需要去磁盘⾥取出相应page的数据,载⼊到undo page⾥) 9.在innodb_buffer_pool的data page做update操作。并把操作的物理数据⻚修改记录到redo log buffer⾥ 由于update这个事务会涉及到多个⻚⾯的修改,所以redo log buffer⾥会记录多条⻚⾯的修改信息。 因为group commit的原因,这次事务所产⽣的redo log buffer可能会跟随其它事务⼀同flush并且sync到磁盘上 10.同时修改的信息,会按照event的格式,记录到binlog_cache中。(这⾥注意binlog_cache_size是transaction级别 的,不是session级别的参数, ⼀旦commit之后,dump线程会从binlog_cache⾥把event主动发送给slave的I/O线程) 11.之后把这条sql,需要在⼆级索引上做的修改,写⼊到change buffer page,等到下次有其他sql需要读取该⼆级索 引时,再去与⼆级索引做merge (随机I/O变为顺序I/O,但是由于现在的磁盘都是SSD,所以对于寻址来说,随机I/O和顺序I/O差距不⼤) 12.此时update语句已经完成,需要commit或者rollback。这⾥讨论commit的情况,并且双1 13.commit操作,由于存储引擎层与server层之间采⽤的是内部XA(保证两个事务的⼀致性,这⾥主要保证redo log 和binlog的原⼦性), 所以提交分为prepare阶段与commit阶段 14.prepare阶段,将事务的xid写⼊,将binlog_cache⾥的进⾏flush以及sync操作(⼤事务的话这步⾮常耗时) 15.commit阶段,由于之前该事务产⽣的redo log已经sync到磁盘了。所以这步只是在redo log⾥标记commit 16.当binlog和redo log都已经落盘以后,如果触发了刷新脏⻚的操作,先把该脏⻚复制到doublewrite buffer⾥, 把doublewrite buffer⾥的刷新到共享表空间,然后才是通过page cleaner线程把脏⻚写⼊到磁盘中 ⽼师,你看我的步骤中有什么问题嘛?我感觉第6步那⾥有点问题,因为第5步已经去open table了,第6步还有没有 必要去buffer⾥查找元数据呢?这元数据是表示的系统的元数据嘛,还是所有表的?
 
 
 

实践篇 (37讲)

 

看过的人还看了

mysql45讲的更多相关文章

  1. 深入浅出索引--Mysql45讲笔记记录 打卡day3

    看了极客时间的mysql45讲记录一下自己理解的关于索引部分 为什么会有索引呢? 答:索引就像书的目录一样,可以让你快速知道你要看的部分在多少页.换句话说,索引就是为了提高数据库的查询效率. 索引的数 ...

  2. 一条SQL语句是如何执行的?--Mysql45讲笔记记录 打卡day1

    写在前面的话:回想以前上班的时候,空闲时间还是挺多的,但是都荒废了.如今找工作着实费劲了.但是这段时间在极客时间买了mysql45讲,就好像发现了新大陆一样,这是我认真做笔记的第一天,说实话第一讲我已 ...

  3. 日志系统:一条sql更新语句是如何执行的?--Mysql45讲笔记记录 打卡day2

    下面是一个表的创建语句,这个表有一个主键id和一个整型字段c: create table t(id int primary key,c int); 如果要将 id = 2 这一行的值加 1,sql语句 ...

  4. MySQL45讲:一条update语句是怎样执行的

    首先创建一张表: create table T(ID int primary key,c int); 如果要更新ID=2这行+1:应该这样写 update T set c=c+1 where ID=2 ...

  5. MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见

    简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败.在MySQL中,事务至此是在引擎层实现的,但并不是所有的MySQL引擎都支持事务,这也是MyISAM被InnoDB取代的原因之一. ...

  6. 深入学习MySQL 01 一条查询语句的执行过程

    在学习SpringCloud的同时,也在深入学习MySq中,听着<mysql45讲>,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处 ...

  7. MySQL学习(八)删除表数据

    表空洞的产生 删除某个行数据 或删除某个页     如下图所示,这个删除过程只是标记了某行的位置为删除,假如此时在300与600之间插入了一行数据,那么 同理,当删除某个页时,该页就会被复用.所以当删 ...

  8. MySQL学习(六)change-buffer

    文章部分总结描述来自参考文章,属于半原创. 概述     文章将会介绍 change buffer 相关的知识点 查看 MySQL InnoDB 状态的命令 SHOW ENGINE INNODB ST ...

  9. MySQL--事务,隔离性和隔离级别

    事务 事务就是一组数据库操作,要么全部执行成功,要么全部执行失败,在MySQL中,事务是依靠存储引擎层实现的. ACID(Atomicity,Consistency,Isolation,Durabil ...

随机推荐

  1. leetcode-hard-ListNode-Copy List with Random Pointer-NO

    mycode 报错:Node with val 1 was not copied but a reference to the original one. 其实我并没有弄懂对于ListNode而言咋样 ...

  2. python下载服务器

    大佬们,你们还在为传输文件时利用U盘插拔而苦恼吗,还在为设置文件共享而苦恼吗?别苦恼了,教你一秒实现文件的传输. 首先我们都要有python环境,这个肯定有. 下面就是一秒,在你要传的文件的目录下输入 ...

  3. Rsa加密类

    需要导入Base64.jar包 import java.io.ByteArrayOutputStream; import java.security.Key; import java.security ...

  4. 用SQL语句操作Sqlite数据库的示例代码

    import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.databa ...

  5. Ubuntu14.04+安卓系统4.3+JDK6编译源码

    本博客主要参照: https://www.jianshu.com/p/ecb9c132030f https://blog.csdn.net/gobitan/article/details/243674 ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上

    笔记 3.Feign结合Hystrix断路器开发实战<上>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖          注意:网上新旧版本问 ...

  7. php上传文件夹

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 功能介绍: 树形目录导航.您可以通 ...

  8. nexus私服库被误删如何恢复

    恢复步骤: 1,登录nexus服务器,找到nexus安装目录(默认/usr/local/下): 2,找到sonatype-work/nexus/trash 下找到你删除的库: 3,copy到指定的so ...

  9. Vue+element 需要用到拖拽组件 vuedraggable

    新需求是要求界面上的14个可以拖拽,点击保存之后保存拖拽之后的顺序. 确定需求之后肯定第一时间是百度,发现有个插件vuedragger拖拽,按照教程就懵懂的开始了. 官方示例:https://davi ...

  10. Unity3D热更新之LuaFramework篇[10]--总结篇

    背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...