MyS# MySQL实战45讲(1)QL实战45讲(1)
第一讲,一条SQL查询语句是如何执行的
select * from T where ID=10
MySQL可以分成Server层和存储引擎两个部分
-
Server层
-
引擎层:InnoDB,MyISAM,Memory
连接器:负责与客户端建立连接
查询缓存:如果某个语句查过了,就直接返回(不建议使用)
分析器:对SQL语句做语法分析,识别表,字段等
优化器:在执行前,对SQL语句做优化,索引,关联顺序
执行器:先看有没权限,然后利用引擎提供的接口查询
第二讲,日志系统
redo log(Innodb引擎层特有的)
WAL:write ahead logging,先写日志,再写磁盘
check_point指向要写到磁盘的,write_pos指向要写的地方
bin log
与redo log的区别:
- bin log是server层的,所有引擎都可以用
- redo log 是物理日志,bin log是逻辑日志
- redo log是类似循环队列,bin log是追加的
两阶段提交
为了让redo log和bin log逻辑一致
- redo log先写完,然后处于prepare阶段
- 等bin log写完后,redo log再提交
第三讲,事务隔离
ACID:原子,一致,隔离,持久
事务遇到的问题:脏读,不可重复的,幻读
隔离级别
- 读未提交:还没提交就能被看到
- 读已提交:提交后才能看到
- 可重复读:一个事务看到的数据,跟他启动看到的一样
- 串行:字面意思
如何实现不同的隔离级别:MVCC
每条记录有一个或者多个read-view,作为不同的版本
不同的事务在不同的隔离级别下看到的不一样