SQL一条语句的过程
-
使用高级语言调用数据库接口来操作数据库,实际上都是调用MySql驱动来对数据库完成增删改查
-
但是同一时间可能有多个SQL请求,多个请求建立多个连接(MySql驱动和MySql数据之间的连接是基于TCP/IP协议),Tomcat虽然可以处理并发请求,但是建立了请求又断开请求是非常耗费资源的,所以使用了池化技术,数据库连接池,同时在MySql数据库方面也维护了一个连接池,负责接收请求,这样也就避免了线程的争抢
-
网络连接必须由线程来处理,在SQL请求,MySql也是由一个个线程去处理的
-
MySQL中处理请求的线程获取到请求后交给SQL接口处理
-
查询解析器(词法分析,语法分析,语义分析等)
-
查询优化器优化,计算IO成本和CPU成本(MySQL是以页的形式读取数据的,将对应的数据的整个页都读取到)
-
执行器调用存储引擎的接口来操作内存数据和磁盘数据
了解存储引擎
-
Buffer Pool,缓冲池,起到类似Redis的作用
-
undo日志文件,记录数据被修改的样子,服务于事务回滚
-
redo日志文件,MySQL为了提高效率,更新操作都先放在内存中完成,然后在某个时机持久化到磁盘中。修改缓存中的数据时需要同步写到redo日志文件中,方便对数据库做持久化修改
-
注意,redo时innoBD特有的,时存储引擎级别的,不是MYSQL级别的
-
-
bin 日志文件,记录整个操作过程,是数据库层面的日志,而上面两种是存储引擎级别的日志
所以到此为止,执行器开始调用存储引擎接口做了哪些事呢
-
先去BufferPool中查找数据,没找到就去磁盘中加载这条数据到BufferPool,加载的同时将原始记录保存到undo日志文件中,方便事务回滚
-
在BufferPool中执行更新操作
-
更新后的数据记录在redo log buffer中
-
MYSQL提交事务的时候会将redo log buffer中的数据写入到redo log中
-
MySQL重启的时候会将redo日志恢复到BufferPool中(如果断电的话,这样可以保证缓存中的数据被暂时持久化了)
-
后台会有一个线程,在某个实际把BufferPool中的脏数据刷到MySQL数据库中,这样来保持统一