1. 一条sql查询语句在mysql中是如何执行的?

77 阅读2分钟
  1. 连接器阶段:输入用户密码和mysql建立连接,断开时间默认是8小时。
  2. 分析器阶段:首先进行的是词法分析,解析出这条sql是干什么的,识别出里面的字符串是怎么样的,然后进行的是语法分析,分析这条sql是否存在语法错误,是否满足mysql语法
  3. 优化器阶段:比如这条sql该使用哪个索引,join的时候怎么连接。
  4. 执行器阶段:首先判断你是否有这张表的权限,然后调用引擎的接口去查询,首先调取第一行,看是否满足,再调取下一行... 这里有个注意点:在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。

关于一条更新语句在mysql中是如何执行的? 与查询语句基本类似,差别点在于执行器阶段,采用先提交redo log prepare阶段日志,再写binlog日志,再commit redo log日志。

  1. redo log:一组4个,每个1g,一共4g,采用循环写,记录的是当前sql做的改动。redo log 用于保证 crash-safe 能力
  2. binlog:追加写,保存当前sql的全部信息。
  3. 为什么要先写redo,再写binlog呢?在于数据的一致性问题。现在由于redo是属于InnoDB引擎,所以必须要有binlog,因为你可以使用别的引擎 保证数据库的一致性,必须要保证2份日志一致,使用的2阶段式提交;其实感觉像事务,不是成功就是失败,不能让中间环节出现,也就是一个成功,一个失败。