首页 > 数据库 >MySQL执行一条语句的过程

MySQL执行一条语句的过程

时间:2022-11-06 00:14:49浏览次数:43  
标签:语句 请求 数据库 MySql MySQL 日志 执行 redo

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数据库中,这样来保持统一

标签:语句,请求,数据库,MySql,MySQL,日志,执行,redo
From: https://www.cnblogs.com/mumayiren/p/16861751.html

相关文章