mysqlselect语句汇总(MySQL Select语句是如何执行的)
mysqlselect语句汇总
MySQL Select语句是如何执行的MySQL Select语句是怎么执行的?
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
今天分享的内容是select和update的执行流程。
select的执行过程
话不多说,来个神图镇楼(自己画的)。
首先,我们可以看到,整个select语句包含三个模块,其中客户端和MySQL两个部分,MySQL又包含server端和存储引擎侧,server端包含连接器、查询缓存、分析器、优化器,执行器等多个部分,存储引擎侧同样包含innodb、Myisam,memory等多种存储引擎。
每个模块的作用如下:
连接器:
连接器的任务是跟客户端建立连接,查询权限,维持和管理连接等等。当我们使用命令行登录时,如果密码或者账号错误,那么连接器会返回给我们Access Deny的报错,利用正确的账号密码登录到MySQL之后,连接器会查询当前账号的登录权限,之后的所有操作,都是依赖这个权限进行的。
注意,如果此时我们更改了该账号的权限,并不会对已经存在的连接产生影响,而只对新加入的连接产生影响。
如果客户端连接进入MySQL后,一直没有进行任何操作,那么连接器将会在wait_timeout参数设置的时间后,将该连接断开。建议在程序中使用长连接,这样可以减小和客户端和MySQL建立连接的带来的性能损耗。
查询缓存:
当客户端输入一个SQL之后,如果命中查询缓存,那么MySQL将会直接返回结果,而不进行下面的一系列分析操作,如果没有命中,则开始进入分析器---优化器---执行器这个流程。关于查询缓存,还有2点需要注意:
a、MySQL8.0中开始弃用查询缓存,因为查询缓存的命中率一般较低,弊大于利。
b、在高并发场景中,建议将查询缓存关闭,关闭时使用query_cache_type=off或者query_cache_size=0。
c、如果非要使用这个功能,可以将参数query_cache_type设置成DEMAND,这样,就可以使用select sql_cache * from table这种方式强制使用查询缓存的功能了。
分析器:
如果我们的查询没有真正命中查询缓存,那么就要进入分析器这个环节了,分析器的主要功能是词法分析和语法分析,其中:
词法分析指的是根据SQL分析出来select、update、alter、列名、表名、库名等;
语法分析是指需要分析你写的SQL是否满足MySQL的语法。如果不满足,则会给出you have an error xxx的提示。
优化器:
优化器的作用是选出SQL执行的最佳路径,例如在多表join的时候,优化器会选择最高效的方案来执行连接查询。这里可以给出一个例子,例如我们建立了(a,b)的联合索引,
select * from table where a=1 and b=1;
select * from table where b=1 and a=1;
这两条SQL是等价的,因为优化器会将下面的改造成上面的样子,从而应用联合索引进行搜索查询。
执行器:
SQL经过优化器之后,就会进入执行器,执行SQL前,需要校验表的权限,如果有权限,会根据表的存储引擎定义,去使用这个存储引擎提供的接口,最终将数据返回给客户端,并开始等待新的连接。
这里需要注意一点:执行器调用一次,在引擎内部则扫描了多行,因此存储引擎扫描行数跟rows_examined并不是完全相同的。
Q && A
Q1:为什么对权限的检查不在优化器之前做?
A1:有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的
Q2:MySQL权限到底在哪里验证?
A2:账号的登录权限在连接器模块验证;表的操作权限分为两种情况,如果命中查询缓存,会在查询缓存放回结果的时候验证,在优化器之前,如果没有命中索引,则权限验证在执行器模块验证。
以上就是MySQL Select语句是如何执行的的详细内容,更多关于MySQL Select语句的资料请关注开心学习网其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1624169
- mysql写入效率越来越差(MYSQL大量写入问题优化详解)
- mysql5.5.36版本介绍(WDCP控制面板升级mysql为5.7.11的方法)
- druid数据库连接池原理详解(阿里巴巴Druid,轻松实现MySQL数据库加密!)
- mysqlbinlog怎么分析(MySQL中使用binlog时格式该如何选择)
- mysql缓存是什么(详解mysql查询缓存简单使用)
- mysql表锁行锁和分页锁(MySQL 不停机不锁表主从搭建)
- 对mysql性能优化的看法(聊聊MySQL的COUNT的性能,看看怎么最快?)
- MySQL中ROUND四舍五入函数需要注意的地方
- mysql如何修改列的默认值(mysql查询的时候给字段赋默认值操作)
- mysql能groupby两个字段吗(MySQL group by语句如何优化)
- mysql中null的用法(为什么mysql字段要使用NOT NULL)
- mysql数据库下载安装步骤(MySQL数据库压缩版本安装与配置详细教程)
- mysql用户登录命令(mysql的登陆和退出命令格式)
- mysql char和varchar区别(MySQL CHAR和VARCHAR存储、读取时的差别)
- SQL SERVER与MySQL数据类型的对应关系
- mysql binlog如何查看(MySQL binlog_ignore_db 参数的具体使用)
- 如何看待美国数十万加仑牛奶倒下水道 历史又重演了(如何看待美国数十万加仑牛奶倒下水道)
- 历史惊人的相似,美国80万加仑牛奶倒入下水道,意味着什么(历史惊人的相似)
- 美国数十万加仑牛奶倒进下水道,世界会重演1929年的大萧条吗(美国数十万加仑牛奶倒进下水道)
- 美国数十万加仑牛奶倒入下水道,贫民区食不果腹,历史再次重演(美国数十万加仑牛奶倒入下水道)
- 美国倒掉数十万加仑牛奶 上热搜第一,这一幕似曾相识(美国倒掉数十万加仑牛奶)
- 深度 倒牛奶 这一幕为何又在美国上演(深度倒牛奶)
热门推荐
- centos linux开机不出现登录页面(在CentOS启动时自动加载内核模块overlayfs操作)
- php实现redis核心代码(PHP结合Redis+MySQL实现冷热数据交换应用案例详解)
- element加固态(Element Plus实现Affix 固钉)
- vue动态列表布局(vue项目实现左滑删除功能完整代码)
- vue封装组件技巧(浅谈vue中所有的封装方式总结)
- sql server 实例功能(SQL Server简单查询示例汇总)
- 目前主流的web服务器有哪些(什么是WEB服务器? 常用的WEB服务器有哪些?)
- vueelementui组件生成页面(Vue Element前端应用开发之树列表组件)
- 云服务器哪个安全速度快(云服务器速度快不快?有哪些测试办法?)
- dedecms不能调用文章发布时间(dedecms文章页上一篇与下一篇标题长度截取的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9