mysql小知识整理

2020-04-14  本文已影响0人  飞翃荷兰人

1 mysql执行流程

执行mysql,首先你要获取到mysql一个连接,建立连接之后,开始正式sql语句流程:首先请求打到server层,如果开启了查询缓存选项(这个缓存在表有新数据写入或者更新时就会清空,所以很多公司都不会开启这个选项),那么首先查看有没有命中缓存,如果没有查询到,那么就开始执行正常的流程,mysql的解释器对sql语句进行词法分析,语法分析,优化器判断到底走不走索引,走什么索引,最终通过引擎层(常见的Innodb,myisam)发生IO,拿到结果。这里盗取极客时间,Mysql45讲的一张图。


image.png

2 mysql中的三种重要日志

首先要明确一点,mysql的所有操作最终都要落盘的,不过mysql是先有日志,再根据日志去落盘。三种主要的日志为:redolog, binlog, undolog。

要理解crash-safe这个概念,可以想象赊账记录的例子。只要赊账记录记在了粉板上或写在了账本上,之后即使掌柜忘记了,比如突然停业几天,恢复生意后依然可以通过账本和粉板上的数据明确赊账账目。

mysql崩溃后恢复流程
假如一个事务插入了一行数据,事务运行中mysql崩溃了:

3 innodb四种事务隔离级别

数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个SQL语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

4 事务多版本控制

事务的多版本控制(MVCC)详细机制复杂,主要是通过视图和undolog进行操作。只要记住以下两条原则就行了,在InnoDb默认的RR级别下,已提交的事务作用不会消失,update会基于最新的。RR的可重复读性质一定会保证。下面具体讲一下:(trx = transaction)
在事务开始时,事务会创建一个视图,并且会有一个数组记录当前正在活跃的事务号,这里用m_ids表示。这个数组是一个单调递增的数组,min_trx_id表示系统中活跃的最小事务id,也就是 m_ids中的最小值。max_trx_id表示在生成视图时,系统应该分配给下一个事务的id。creator_trx_id表示当前的事务id。

上述关于mvcc的描述摘取自知乎上的回答
作者:Java汤姆
链接:https://zhuanlan.zhihu.com/p/131395174

min_trx_id和mx_trx_id通常被称为低水位和高水位,低于低水位的一定可见,高于高水位的一定不可见,位于两者之间的要看是否存在于活跃事务中,存在于活跃事务中的不可见,不存在的可见(说明事务开启前已经被其他事务提交)。

但是对于更新来说,更新操作一定是基于已经提交的最新事务来做的,要不然已经提交的事务就会丢失。所以,对于某些更新操作来说,虽然“读不出来”最新的值,但是会按照最近的值去更新。

5 常见的锁

事先声明,这些锁是站在不同维度来说的,并不是相互对立的概念。https://www.jianshu.com/p/bf862c37c4c9
这篇讲的很好。

session 1:
start  transaction ;
select  * from news where number=4 for update ;

session 2:
start  transaction ;
insert into news value(2,4);#(阻塞)
insert into news value(2,2);#(阻塞)
insert into news value(4,4);#(阻塞)
insert into news value(4,5);#(阻塞)
insert into news value(7,5);#(执行成功)
insert into news value(9,5);#(执行成功)
insert into news value(11,5);#(执行成功)

可以看到,虽然4这个索引只出现了一次,但是这条记录两边的间隙都被锁住了,不允许插入新的数据。

tips:要牢记间隙锁是加在索引上的,在看间隙锁锁住哪些间隙的时候,要以普通索引为主,主键索引为辅,例如:三条记录: (1, 1),(2, 2),(3,3),(4,1)这四条记录,假如第一列为聚簇索引,第二列为普通索引,判断间隙锁锁什么的时候应该这样看:
(1,1),(4,1),(2,2),(3,3),如果对普通索引为1进行加锁,那么会锁住与(2,2)之间的间隙,(3,3)前后不受影响。

6 myisam引擎和innodb引擎的区别

myisam是5.5版本之前的默认引擎,后续的默认引擎都换为了innodb,具体区别如下:
作者:oscarwin
链接:https://www.zhihu.com/question/20596402/answer/211492971
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

小知识:

上一篇 下一篇

猜你喜欢

热点阅读