MySQL实战四十五讲笔记
2022/1/17 19:10:53
本文主要是介绍MySQL实战四十五讲笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
-
第一天:SQL查询语句是如何执行
- SQL可以划分成:Server层、存储引擎层次
- Server层:包括连接器、分析器、优化器、执行器等(涵盖Mysql的大部分核心功能),包含内置函数等,所有跨存储引擎的功能都是在该层实现
- 具体实现功能
- 连接层:负责与客户端连接,获取权限 、管理和维持连接
- 连接完成后,若客户端没有后续操作,数据库处于空闲状态。若客户端长时间未连接会自动将其断开(Wait_timeout控制)默认8小时
- 登入的命令行格式:(连接命令)
- 数据的连接方式:长连接、短连接
- 长连接:连接成功后,客户端若有持续的请求,则使用同一个连接
- 长链接:优点:减少连接配置,从而减少相应的系统开销
- 缺点:由于长期连接,执行过程中使用的临时内存占用过大,导致容易出现(OOM)的现象
- 解决办法
- 定期断开长连接:在判断是否执行一个较大内存的查询后,断开,等到下次查询需要后再连接
- 在MySQL5.7版本后,在执行比较大的内存后,,使用mysql_reset_connection 俩重新初始化连接资源
- 短连接:客户端执行几句SQL语句后就断开,等到下次查询再重新建立
- 长连接:连接成功后,客户端若有持续的请求,则使用同一个连接
-
查询缓存
-
查询缓存是会对之前查询的结果以Key -value的形式保存起来的临时数据区,当数据库执行更新操作(ddl时),缓存则会被全部更新
-
执行流程
-
数据库通过语法分析器分析出SQL语句所要表达的含义,若是select等查询语句,则优先进行到缓存中查询是否之前有查询过(速度较快),若缓存中不存在该数据,则会进行到数据库中进行查找
-
特点:查询缓存的命中率低,适合使用数据变化不多的静态表
-
设置参数:query_cache_type 设置成DEMAND (默认的sql语句查询就不会使用查询缓存)
-
-
- 分析器
- 含义:将sql语句进行解析,明确该语句的目的和执行要求
- 词法分析:会将sql语句的字符串识别出代表什么含义
- 若语法错误,则会报出相应的提示:You have an error in your SQL syntadx
- 重点关注:user near的内容
- 优化器:优化器通常是在使用多表查询的时候进行,它决定着使用什么的索引或者是多表查询时,决定各表的连接顺序
- 优化器的选择索引以及具体操作后续描述
- 执行器:执行相应的语句
- 执行流程:
- 判断用户的表是否拥有相应的权限
- 若用户拥有权限,则继续执行,通过表所定义的引擎,使用引擎定义的接口
- 执行流程
- 通过条件进行搜索,若不符合条件则跳过,符合条件加入结果集
- 调用引擎的接口的下一行,重复相同的逻辑,直至执行到最后一行
- 将结果集返回给接口
- 注意在数据库的慢查询日志中存在:row_examined 字段。表示语句执行是扫描了多少行
- 执行流程:
- 连接层:负责与客户端连接,获取权限 、管理和维持连接
- 具体实现功能
- 存储引擎:负责数据的存储和提取(插件式)
- 类似:Mysam、Innodb、Memory (MySQL的默认存储引擎(5.7版本后)是Innodb
- Server层:包括连接器、分析器、优化器、执行器等(涵盖Mysql的大部分核心功能),包含内置函数等,所有跨存储引擎的功能都是在该层实现
- SQL可以划分成:Server层、存储引擎层次
-
第二讲:日志系统:SQL的更新语句是如何实现
- 实现背景
- 在执行更新流程时,首先缓存会被全部更新,与此同时,会启动相应的日志模块,用于记录当前的操作步骤。由于IO操作的速度过慢,系统开销大,所以对于操作,优先使用日志进行记录,而后在同步到数据库中。
- 日志模块
- redo log(重做日志)(引擎层的日志)
- Mysql在执行更新操作时,Innodb 引擎会先将记录记录到redo log中,等到更新完成后,Innodb会在合适的时机将记录更新到磁盘
- 若更新操作产生的记录过多,Innodb会将最先记录更新到磁盘中,并且清除,用于存储新记录的日志
- redo log的大小是固定的,其中 write pos 表示当前记录的位置(一边写入一边移动)checkPoint 表示当前需要清除的位置
- crash-safe 由于存储redo-log,即使数据库出现异常重启,之前的记录也不会丢失
- binlog(归档日志)(server 层的日志)
- 为什么拥有两套日志
- Innodb是以插件的形式补充到MySQL中,原本的MySQL使用myisam没有crash-safe的能力,只能依靠binlog进行记录
- 两者的区别(binlog、redo log)
- binlog是MySQL的server层实现,所有引擎都可以使用,而redo log只能是Innodb使用
- redo log 是物理日志,记录在数据页进行说明修改,binlog是逻辑日志,记录的是原始逻辑
- redo log 是循环写,大小固定 binlog 是可以追加写,写完一页后会再写一页
- 执行逻辑
- 为什么拥有两套日志
- 两阶段提交
- redo log将数据更新到磁盘时,需要将其拆封成两个部分(prepare 和commit),目的是让两份日志之间的逻辑一致(维持数据逻辑一致性的常用方法)
- 恢复操作的流程
- 通过全量备份获取到上一阶段的备份,将其恢复到数据库
- 将数据库从备份的节点开始,从备份的binlog依次取出,回复到误删的表的时刻
- 使用场景
- 误删除数据时候,需要恢复数据时进行操作
- 在需要扩容的时候需要搭建备库来增加读能力,通常使用全量备份+binlog来实现,未使用会导致出现备份库与主库出现“主从数据库不一致”
- 使用的流程
- 恢复操作的流程
- redo log将数据更新到磁盘时,需要将其拆封成两个部分(prepare 和commit),目的是让两份日志之间的逻辑一致(维持数据逻辑一致性的常用方法)
- redo log(重做日志)(引擎层的日志)
- 实现背景
-
第三讲:事务的隔离
- 事务的特性
- ACID(原子性、一致性、隔离性、持久性),其中事务的隔离属于I(ISOLATION)
- 数据库出现的问题:脏读、可重复读、幻读
- SQL标准的隔离级别
- 读未提交:事务未提交的时候,出现的变更就可以被其他事务看到
- 读已提交:事务在提交之后,才能被其他的事务所看到
- 可重复读:一个事务在执行过程中看到的数据和启动时候看到的数据是一致,只有当前的事务提交后,才能看别人更新的数据
- 串行化:对同一行记录加锁(写锁和读锁)出现读写锁互斥的时候,后访问的事务必须等前面的事务提交后才能执行
- 在实现过程中
- 可重复读:在事务创建的时候创建相应的视图,在未提交之前都是使用着这个的视图的逻辑结果为准
- 读已提交:在执行SQL语句的时候才创建的
- 读未提交:是直接依据数据库上记录的数据来进行返回的
- 串行化 :直接通过加锁的方式避免并行访问
- 效率问题上:隔离的越严实,就会导致其效率越低
- 可重复读的应用场景:对于更新数据,不影响之前的数据的统计的结果(银行月底结账)
- oracle 默认的隔离级别是:读已提交 MySQL的默认隔离级别是可重复读
- 事务隔离级别的实现(通过回滚进行实现)
- MVCC(多版本并发控制):MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
- 作用:主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突(不加锁)
-
MVCC 带来的好处是?
多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。 所以 MVCC 可以为数据库解决以下问题在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题 -
1
-
详细学习参考这篇:(46条消息) 【MySQL笔记】正确的理解MySQL的MVCC及实现原理_长路漫漫的歇脚处-CSDN博客_mvcc原理
-
事务的启动:
-
显示启动 :begin、start transation 提交事务 :commit 回滚 rollback
-
set autocommit = 0 关闭自动提交事务 (在执行select 语句的时候会进行事务的自动开启)(通常建议去开启事务 set autocommit =1 )
-
在set autocommit =1 的条件下,显示的开启事务:begin。若使用commit提交则直接就提交,若使用commit work and chain ,则是自动提交事务并且自动开启下一个事务(减少一次交互)
-
-
长事务的影响
-
长事务:
-
占用锁资源,导致后面进行处于死锁
-
长事务会导致回滚段被 大量的保留(系统中会保存着很老的事务视图),会占据大量的存储资源
-
在事务开启的时候,长连接的出现会导致长事务的出现
-
-
查询长事务的方法
-
information_schema 库中的innodb _ trx来查询长事务(持续时间再60s)
-
-
- 事务的特性
第四讲:索引:
这篇关于MySQL实战四十五讲笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程