说说执行一条 MySQL 查询(select)发生了哪些事情?

SQL herman 51浏览

每一个看似没有简单的系统,背后都有强大的技术在支撑。比如,我们咋淘宝购物,买一件商品你只需要点点手指。但是背后却发生了很多运算,据说你购买一件商品产生的能量可能够用来煮熟一个鸡蛋了。那么说到 MySQL,你执行一条 Select 语句,背后最终发生了哪些事情呢?且看本文给你解惑!

select * from xttblog;

从表面来说,一条查询语句我执行后肯定会判断语法是否错误吧。就如上面的 SQL,假如我写的一个关键字,或者某个符号不对,它肯定会报错吧。所以执行一条 SQL 语句后,MySQL 的底层肯定又一个语法解析器,或者说是语法分析器。

想到这里,说明你认真思考了。

那我们在想一想,我们要进行查询是不是要进行通信啊。通信的话,是不是就有一个专门管理通信的,包括连接管理,数据包处理等。专门处理客户端的请求。实际上这是靠 MySQL 中的一个连接器来管理的。

然后,再想想。MySQL 作为一个数据库,肯定存在大量的并发请求,并发查询吧。那么有没有类似高可用架构中的一些缓存设计呢?

有了这个想法以后,我们就可以通过 SQL 语句来验证我们的想法了。验证过程很简单,首先写一个稍微复杂一点的 SQL,然后在海量数据里进行查询。第一次查询时间肯定比较久,在接着执行第二次查询,你会发现第二次查询变快了。

这是不是就验证了我们想法。实际上 MySQL 里确实设计的有缓存,每次查询的时候,拿客户端发送过来的完整的 sql 语句,如果命中缓存,就会直接返回结果,不需要往下继续进行了。

我们接着在想,我随便写一条 SQL 语句,然后查询。然后我们看 explain 执行计划,会发现有些 SQL 写的并不理想。执行计划会列出一些结果,然后我们在调整优化 SQL,直到达到最优效果。这个过程是谁来做的呢?就是 MySQL 底层中的优化器来做的。

当所有的准备工作都完成后,MySQL 才开始真正的查询操作。这就是执行器该干的事情。执行器是最终真正执行查询的步骤,在经历了分析,优化之后,执行器会以最高效的计划去进行查询。
执行器的第一步是判断该用户是否有查询表的权限,如果没有直接返回错误,如果有就会打开表继续执行。执行器其实是调用对应表的存储引擎所提供的接口来进行查询的。

所以,MySQL 中的存储引擎也是很重要的一部分,最终的操作都在存储引擎中执行。MySQL 有三个非常重要的存储引擎,MyISAM,InnoDB,MEMORY。

MyISAM 它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以 SELECT、INSERT 为主的应用基本都可以使用这个引擎来创建表。

InnoDB 支持事务,外键,一般来说如果需要事务支持,并且有较高的并发读取频率,InnoDB 是不错的选择,而且从 MySQL 5.5 之后的版本都是默认 InnoDB 引擎。

MEMORY 数据全部存储于内存,适合数据量小,响应速度快。

一条 select 的执行过程

最后,让我们用上面的这张图来总结全文吧!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847,QQ3群:187424846。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 说说执行一条 MySQL 查询(select)发生了哪些事情?