MySQL学习-SQL执行流程(一)

44 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

前言

上篇我们学习了MySQL中的逻辑架构。有兴趣的小伙伴可以阅读(# MySQL学习-逻辑架构(三))。
下面我们继续学习MySQL中的SQL执行流程。

SQL执行流程

上一节的最后,学习总结了SQL的执行流程如下:
SQL语句->查询缓存->解析器->优化器->执行器。

下面详细学习总结下里面的流程。

查询缓存

Server接收到客户端传输的SQL语句后,首先会查询缓存,如果在缓存中发现了SQL语句会直接返回结果,如果没有,会进入下一阶段。这是上一节学习总结过的。需要特别说明的是,此缓存机制由于往往效率不高,所以在MySQL8.0后已经抛弃了这个功能。下面详细对缓存机制进行说明:
查询缓存就是提前把查询结果缓存起来,这样下次就不需要执行可以直接拿到结果,需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。这就意味着查询匹配的鲁棒性大大降低,只有相同的查询操作才会命中查询缓存。两个查询请求在任何字符上的不同(包括空格,注释,大小写等),都会导致缓存不会命中。因此MySQL的查询缓存命中率不高。同时,如果查询中包含某些系统函数,用户自定义变量和函数,一些系统表,如mysql、information_schema等数据库中的表,那这个请求就不会被缓存。以某些系统函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW,每次调用都会产生最新的当前时间,如果在一个查询中调用了这个函数,那即使查询请求的文本信息都一样,但是不同时间的两次查询也应该得到不同的结果,如果在第一次查询时就缓存了,那第二次查询的时候直接使用第一次的结果就是错误的。
另外,既然是缓存,那就有它缓存失效的时候。MySQL的缓存系统会监测到每张表,只要该表的结果或者数据被修改,如对该表使用了INSERT、UPDATE、DELETE、TRUNCATE TANLE、ALTER TABLE、DROP TABLE或DROP DATABASE语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。对于时常更新的数据库的来说,查询缓存的命中率非常低。

今天先学到这里,明天继续学习解析器等详细流程。