sql执行顺序和隔离级别

首先画出MySQL的基础架构示意图
在这里插入图片描述
大致来说,MySQL可以分为server层和存储引擎两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
默认的搜索引擎是InnoDB,从5.5.5开始成为默认的。你可以在建表时候设置引擎,但是所有的引擎公用一个server层。

连接器

mysql -h$ip -P$port -u$user -p

一般链接命令如上。

  1. 权限控制更改,重新连接后才生效。
  2. 默认链接时长8小时
  3. MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源在断开连接时候才释放,试过长连接太多会导致内存占用太大 解决办法:1.定期断开长连接;定时或占用大的内存的查询后,断开链接 2. 较大的操作后执行mysql_reset_connection

缓存查询

之前查询过的请求,查询语句和结果会时key-value的形式存在内存中,如果命中直接返回。
MySQL8.0开始没有这个功能了

分析器

词法分析:识别关键字 并 把一些简写的字符转换为具体的表名或者列名
语法分析:一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。
如果使用了不存在的列名,在此处会抛出异常

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
inner join 优化器会选择较小的表作为驱动表
left join 是左表为驱动表
right join 是右表为驱动表
驱动表不走索引

执行器

这里也会先判断你对这个表有没有操作权限,没有会返回错误。

笛卡尔积原理

A表有2行 B表有4行 笛卡儿积就是8行

数据库事务隔离级别

ACID

A:Atomicity 原子性
一组操作要么全部成功,要么失败回滚,就像没发生一样
C: consistency 一致性
在事务完成前后,数据在业务意义上是“正确的”
I:isolation隔离性
不同事务对于数据的操作互不影响,如果是操作不同的数据,自然隔离;但如果操作相同的数据,就需要保证事务的顺序性。
D:duration 持久性
是指对数据的修改,一旦完成,该结果就应当永远不丢失
事务隔离级别

  • 脏读:读到了别的事务未提交的内容
  • 不可重复度:一个事务两次read得到了不同的值,在此之间有别的事务提交
  • 幻读:一个事务两次读到了不同数量的值,这里可以读到新插入的数据读不到更改的数据

Read-commit读未提交
Read-commit 读已提交 --解决了脏读
Repeatable-read 可重复读 –解决了不可重复读
Serializable 串行化 –解决了所有

MVCC 多版本并发控制

每个数据记录携带两个额外的数据created_by_txn_id和deleted_by_txn_id。

  • 当一个数据被insert时,created_by_txn_id记录下插入该数据的事务ID,deleted_by_txn_id留空。
  • 当一个数据被delete时,该数据的deleted_by_txn_id记录执行该删除的事务ID。
  • 当一个数据被update时,原有数据的deleted_by_txn_id记录执行该更新的事务ID,并且新增一条新的数据记录,其created_by_txn_id记录下更新该数据的事务ID

在另一个事务进行读取时,由隔离级别来控制到底取哪个版本。同时,在读取过程中,完全不加锁(除非用SELECT … FOR UPDATE强行加锁)。这样可以极大降低数据读取时因为冲突被Block的机会。
那么那些多出来的无用数据怎么被最终被清理呢?支持MVCC的数据库一般会有一个背景任务来定时清理那些肯定没用的数据。只要一个数据记录的deleted_by_txn_id不为空,并且比当前还没结束的事务ID中最小的一个还要小,该数据记录就可以被清理掉。在PostgreSQL中,这个背景任务叫做“VACUUM”进程;而在MySQL InnoDB中,叫做“purge“。
MySQL采用Undo Log的实现。这种实现下,用于存储数据表的B+树节点总是只保留最新的数据,而老版本的数据被放在Undo Log里,并且以指针的形式关联起来,形成一个链表。这样,在查找老的版本时,需要按链表顺序查找,直到找到created_by_txn_id <= 当前事务ID的最新那条记录即可。这种实现的优缺点和PostgreSQL正相反,查询时会在B+树查找后多引入一个链表查询;但是清理废弃数据时会更简单,只要把Undo Log找到一个合适的位置一刀切了即可。
有了MVCC,Read Committed和Repeatable Read就的实现就很直观了:
• 对于Read Committed,每次读取时,总是取最新的,被提交的那个版本的数据记录。
• 对于Repeatable Read,每次读取时,总是取created_by_txn_id小于等于当前事务ID的那些数据记录。在这个范围内,如果某一数据多个版本都存在,则取最新的。
有趣的是,隔离级别可以是一个Session级别的配置。即每一个Session可以在运行时选择自己希望使用什么隔离级别,也可以随时修改(只要当前没有尚未结束的事务)。每个Session的隔离级别和其他Session是什么隔离级别完全无关。Session只要根据自己的隔离级别,选择用MVCC提供的合适的版本即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值