MySQL8.0为何取消查询缓存模块
这个模块的设计 , 把查询语句作为key , 将结果作为value 进行缓存 , 一旦这个表有更新 , 之前所有的缓存都会被清除掉 。这就像你辛辛苦苦写的代码提交之后被别人覆盖一样难受 。
MySQL8.0以下的版本提供了一个参数query_cache_type = enmand来控制是否要使用查询缓存 , 在设置完成后 , 默认的select语句将不会被缓存 。
如果确实可以使用部分场景 , 那么你可以将sql_cache添加到select关键字之后 。
如果一条select语句之前被缓存过 , 那么结果集在这里就会直接返回 , 而没有缓存过的select语句就比较辛苦了 , 还要继续自己的漫漫长路 。
2-3 分析器MySQL8.0之前 , 它会在进入分析器之前判断是否缓存 , 在MySQL8.0之后 , 连接器验证成功后就直接进入分析器 。
分析器 , 根据字面意思来理解就是分析要执行的SQL语句是什么 , 要做什么 。
比如执行select * from user where id = 1
MySQL首先根据select判断这是一个查询语句 , 然后将user识别为表名 , id识别为字段名 , 这个过程被称为词法分析 。
下一步 , 需要知道该SQL的语法是否正确 , 进行语法分析 , 如果语法不对你就会看到You have an error in your SQL syntax错误 。通常 , 将在use near中找到该错误 。
2-4 优化器到了这一步 , MySQL知道你要做什么 , 但是要选择最佳执行方案 。
优化器都优化些什么?
举例来说:多个索引时选择那个索引、多表关联时连接顺序 。
现在你是否想知道 , 优化器将优化多表关联的连接顺序 , 那在写SQL语句时是否就不必考虑连接顺序呢?
当然不是 , 能让MySQL少做事情就少做 , 还是一个准则用小表驱动大表 。
2-5 执行器通过要做什么、怎么做后这条SQL语句才会真正地被执行 , 先进行权限验证 , 若没有权限则直接返回权限错误 , 否则根据表定义的存储引擎 , 去使用对应引擎提供的接口 。
三、总结

文章插图
上图包含了正文的所有知识点 , 也是整个MySQL的大体执行流程图 , 后期文章都将围绕这几个要点展开 。
【原来一条select语句在MySQL是这样执行的】
推荐阅读
- 原来自己可以搭建邮箱服务器发送邮件
- 超大文件传输 | 网络直连与雷电网桥
- 木槿花唯美图片,唯美意境图片
- 关羽的坐骑叫啥,关羽原来的坐骑是什么
- 薄荷|薄荷糖上为啥有个洞?是为了偷工减料?原来跟公司名有关
- Jenkins结合SpringCloud+K8S,打通微服一条龙技术讲解
- 应届生|跟应届生谈经验,跟有经验的人谈年龄,原来面试的“套路”真不少
- 服务器能承受同时在线人数原来是这么计算出来的
- Mysql注入 -- 联合注入
- 你运动了,你少吃了,结果你就是没瘦,原因原来在这......
