作为一个菜鸟程序员(我),每天会写各种各样的业务代码,不可避免的,会写到很多很多的sql语句。随着我的业务代码越来越熟练,sql语句也越写越多。那么大家有没有和我一样,有一天突然很想知道一条sql语句是怎么执行的呢?
假设我们有一个非常简单的表a,表中只有一个ID字段,那么在执行下面sql语句:
select * from a where id = 1;
mysql到底会执行一些什么操作呢?
下面是我了解到的mysql结构图,通过结构图你大概可以了解到mysql的整个执行流程
首先,你需要连接mysql的
“Access denied for user”。
mysql通过了你的连接请求后会去
如果命中缓存,直接返回这条sql缓存的value,如果没有,这条sql会进入分析器对这条sql进行解析。
分析器会解析这条sql,首先会进行语法分析,例如我手速太快输入了一条错误的sql
selct * from a where id = 1;
分析器会先对这条sql做语法解析,很明显,mysql是看不懂selct的,这时解析器就会报错,
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selct * from a where id = 1' at line 1
语法通过后分析器还会
在分析器通过后,mysql还会进入优化器进行sql改写,例如
优化器该写完sql就会
SELECT command denied to user 'test'@'localhost' for table a
执行的时候对于不同的sql引擎执行的顺序不一样,这个问题在以后我可能会写。之后执行器就会开始去执行sql了,执行器会一行一行的和数据去比对,符合条件的会返回这一行然后继续找下一行,知道扫完整个表或者整个匹配到索引的记录。
一条sql的执行顺序大概就会经过这些流程,总结一下就是以下两种情况
差点忘记了为什么大部分情况下
首先我们需要了解到的一点是,缓存确实可以加快查询,理由见上面的流程1。但是一条缓存在什么情况下会失效呢?
另外提一下在mysql8.0的时候mysql已经彻底砍掉了缓存功能了=-=可见缓存功能的鸡肋程度。还有8.0mysql也顺便废掉了不支持事务的myisam,默认引擎变成了innodb,innodb的优势我也会找机会提到。
本文为龚学鹏原创文章,转载无需和我联系,但请注明来自龚学鹏博客http://www.noobcoder.cn
最新评论