1.一条查询语句的执行流程

我们想要理解mysql的原理,我们就必然要去理解一条sql语句的执行流程!

mysql执行流程图

下面我们就一步一步分析mysql的执行流程:

1.我们的程序或者工具要操作数据库,首先我们要建立数据库建立连接,那么既然是连接,就会有通信协议以及通信方式!MySQL 是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。MySQL用的比较多的是Unix Socket协议,以及常用的是半双工的通信方式。

半双工的通信方式:要么是客户端向服务端发送数据,要么是服务端向客户端发送数据,这两个动作不能同时发生。所以客户端发送 SQL 语句给服务端的时候,(在一次连接里面)数据是不能分成小块发送的,不管你的 SQL 语句有多大,都是一次性发送。比如我们用 MyBatis 动态 SQL 生成了一个批量插入的语句,插入 10 万条数据,values后面跟了一长串的内容,或者 where 条件 in 里面的值太多,会出现问题。这个时候我们必须要调整 MySQL 服务器配置 max_allowed_packet 参数的值(默认是 4M),把它调大,否则就会报错。另外一方面,对于服务端来说,也是一次性发送所有的数据,不能因为你已经取到了想要的数据就中断操作,这个时候会对网络和内存产生大量消耗。所以,我们一定要在程序里面避免不带 limit 的这种操作,比如一次把所有满足条件的数据全部查出来,一定要先 count 一下。如果数据量大的话,可以分批查询。

2.查询缓存:主要是用来加快数据的读取速度,也可以减少服务器的处理时间。不过mysql默认关闭,不推荐使用,甚至在mysql8都被删除了

3.语法解析和预处理:主要解决 SQL 语句能够被识别以及该sql语句是否错误的问题,比如我的格式有问题,那语法解析就会解析出来,如果格式没问题,但是查询的表名不存在,那这个时候就会去预处理,然后返回相应的错误!

4.查询优化(Query Optimizer)与查询执行计划:一条 SQL 语句不是只有一种执行方式,查询优化器的目的就是根据语法解析生成的解析树生成不同的执行计划(Execution Plan),从而选择一种开销最小,最优的执行计划!

5.存储引擎:解决在关系型数据库里面,数据是放在什么结构里面的问题。MySQL 里面,支持多种存储引擎!

常见的存储引擎:1)MyISAM:适合只读之类的数据分析的项目 2)InnoDB:适合经常更新的表,存在并发读写或者有事务处理的业务系统 3)Memory:只适合做临时表,将表中的数据存储到内存中。4)CSV:不允许空行,不支持索引。格式通用,可以直接编辑,适合在不同数据库之间导入导出。

如何选择存储引擎:1)如果对数据一致性要求比较高,需要事务支持,可以选择 InnoDB。2)如果数据查询多更新少,对查询性能要求比较高,可以选择 MyISAM。3)如果需要一个用于查询的临时表,可以选择 Memory。

6.执行引擎:利用存储引擎提供的相应的 API 来完成操作!

为什么我们修改了表的存储引擎,操作方式不需要做任何改变:因为不同功能的存储引擎实现的 API 是相同的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容