每一个看似没有简单的系统,背后都有强大的技术在支撑。比如,我们咋淘宝购物,买一件商品你只需要点点手指。但是背后却发生了很多运算,据说你购买一件商品产生的能量可能够用来煮熟一个鸡蛋了。那么说到 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 数据全部存储于内存,适合数据量小,响应速度快。
最后,让我们用上面的这张图来总结全文吧!
: » 说说执行一条 MySQL 查询(select)发生了哪些事情?
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/252390.html