首页 > mysql > mysql的一条sql是如何执行的?

mysql的一条sql是如何执行的?

作者:bin

一、我们先来看查询sql



1.连接器
验证权限信息,我们可以通过以下命令来查看连接信息

mysql> show processlist;
+------+------+-----------------+------+---------+-------+----------+------------------+
| Id   | User | Host            | db   | Command | Time  | State    | Info             |
+------+------+-----------------+------+---------+-------+----------+------------------+
| 1010 | root | localhost       | wwj  | Sleep   |  1362 |          | NULL             |
| 1012 | root | localhost       | wwj  | Query   |     0 | starting | show processlist |
+------+------+-----------------+------+---------+-------+----------+------------------+
5 rows in set (0.00 sec)

2.查缓存
如果缓存中有,那么会先去查缓存,缓存中存的就是key-value形式的map,key就是查询语句,value就是值。
可以使用SQL_CACHE来指定使用缓存,或者SQL_NO_CACHE指定不使用缓存

select SQL_CACHE * from t where id=1;

3.分析器
对sql做语法分析,如下提示就是分析器抛出的

You have an error in your SQL syntax

4.优化器
优化器会选择使用哪个索引去查询,也可以使用force inde指定id

select * from t force index(c) where id = 0;

5.优化器
调用存储引擎的接口去获取结果,例如innoDB,就调innoDB的接口去获取结果

二、我们再来看更新的sql


Server层基本和查询一致,只是缓存这里会先删除缓存。

我们直接看引擎层
1.先根据buffer pool中的缓存值,新增undolog,如果buffer pool中没的话,就要从磁盘读取
2.修改buffer pool,同时写入redolog,同时redolog进入prepare状态
3.写入binlog,写入成功后,redolog变成commit状态,同时事物也commit
4.commit成功只会,dump线程会将修改的event同步给slave库

您必须 [ 登录 ] 才能发表留言!