My SQL 学习打卡 60天搞定mysql

Day01--查询语句执行流程

  mysql 基础架构:

    

  MySQL 5.5.5 版本开始InnoDB成为了默认存储引擎

  连接器:

  链接器超时断开参数 wait_timeout   默认 8小时

  缓存

  mysql 缓存提供按需使用的方式  将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定

  MySQL 8.0 版本直接将查询缓存的整块功能删掉了

mysql> select SQL_CACHE * from T where ID=10;

  分析器:

  分析器先会做“词法分析”。再做“语法分析” 

   优化器:

  优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

  执行器:

  首先判读用户对表有没有查询权限。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

  数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的

Day02--更新语句执行流程

  更新比查询多涉及两个日志模块  redo log 和 binlog

  

mysql> update T set c=c+1 where ID=2;

  

  redo log

  redo log 属于innodb 独有日志。

  

  如图 InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写。  

  write pos 是当前记录的位置 heckpoint 是当前要擦除的位置。中间绿色部分为剩余空间。

  有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe

  binlog

  binlog 是server 层的日志

   这两种日志有以下三点不同。

  redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

  redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

  redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

  这个 update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的。

  

   最后三步将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"

  好处:为了让两份日志之间的逻辑一致

文章来源:极客时间 丁奇--MYSQL 实战 45讲

  

猜你喜欢

转载自www.cnblogs.com/xiaolin-qian/p/12220699.html