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库