最近学习丁奇老师的《MySQL实战45讲》,明白了以前一知半解的概念,对MySQL的运行机制有了比较系统的理解。
课程内容组织得非常好,留言里面也有很多精彩的见解,学到了很多东西,过程很享受。
在此先感谢下丁奇老师。
这里把学到的内容组织一下,把知识点串成线,织成网。
写下来的只是个提纲,以及一些要点。
接下来还要学以致用,在实际工作中带着这些知识去练习。
把学到的内容归纳为三部分:
一、基础概念
二、运维管理
三、合理使用MySQL
第一篇:基础概念
1. 事务
第3讲,8讲,20讲
事务是关系数据库(RDB)区别于非关系数据库的关键特性。
关键在于理解并发时可能出现的问题,以及避免这些问题出现的机制。
从问题入手:
- 脏读:读到其他事务未提交的修改
- 不可重复度:同一行,两次读到的数据不同
- 幻读:两次执行同一个sql,得到的结果集不同
理解“问题”的关键:两次读,是限定在一个事务的上下文内的。
很简单,可我之前就是没领会到,汗 ~ ~ ~
隔离级别(InnoDB):
- 读提交(RC),解决脏读问题
- 可重复读(RR),解决不可重复读问题,以及大部分幻读问题
- 串行化,同时只能有一个事务运行,完全解决幻读问题
隔离级别越高,解决的问题越多,并行能力越低。
InnoDB的缺省隔离级别为:可重复度。
2. 锁
第6讲,7讲,19讲,20讲,21讲,30讲,39讲,40讲
锁是数据库用以实现事务隔离的工具。
按照被锁定的对象,有:全局锁、表锁、MDL、行锁、gap lock、自增锁等。
按并行能力,可分共享锁(读锁)和互斥锁(写锁)
两阶段锁:锁在需要时加上,在事务结束时释放。
行锁、gap lock:这两个锁要重点学习。它们都在索引上执行。被访问到的记录才需要加锁。如果查询的是非主键索引,除了在非主键索引上的 next-key lock,还要在主键索引上对符合条件的记录加行锁。
MDL(meta-data lock)
为避免表结构被其他线程修改,自动加锁。
5.6版本实现online DDL,通过 MDL降级使得DDL期间仍可读写该表,提升并行能力。
原理:DDL语句先申请DML写锁,拿到MDL写锁之后,创建临时表,把源表数据拷过去,变更临时表数据结构,然后再用临时表替换源表,并把期间对源表的变动应用到新的表。在拷贝数据、变更临时表数据结构期间,MDL写锁降级为读锁,其他事务可以对原表进行读写。最后临时表和源表切换的时候,再从MDL读锁升为写锁。
死锁检测
死锁检测,时间复杂度为O(n^2)
高并发的情况下,如果出现大量锁等待,会因为死锁检测,消耗大量的CPU,导致性能急剧下降。
<