MySQL是工作中用的最多最广的数据库,我们日常的工作CRUD最终都是在写SQL或者优化SQL,当然简单的SQL现在市面上的ORM框架都能处理,比如MyBatis-Plus,那么我们在使用ORM框架或者原生JDBC操作数据库时,数据库究竟是怎么处理我们的SQL语句的呢?
大致可以分为以下几个步骤:
1.首先对于客户端需执行的SQL语句要传递到MySQL服务器上,那么需要和MySQL服务建立连接,此时和MySQL建立连接采用什么协议呢?
我们主要从两个方面看:
a.从项目上来说是通过mysql-connector的jar包进行连接这个时候会采用TCP协议进行连接。
b.直接操作MySQL服务器的时候,此时两种情况一种是直接通过mysql -uroot -p****,这种方式也是采用Unix Socket进行连接,如果使用mysql -h主机地址 -uroot -p****,这种方式也是采用TCP进行连接。
每次能够传递的SQL或者应答结果的大小是多少?
通过指令 show variables like 'max_allowed_packet';查看
大小是4M,说明客户端的SQL语句大小和MySQL服务器应答的数据一次性的大小不能超过4M,警惕使用SQL查询时结果尽量要limit,批量插入时一次性value不能太多。
2.检查缓存器中是否有该sql语句执行的结果缓存有的话直接返回,这个功能很鸡肋,限制很大,当我们查询的SQL含有不一样的空格数即使sql语义一样,或者查询的table数据有写入操作都会导致缓存失效,因此MySQL也在16年发布的8.0版本中去掉了查询缓存器。
3.解析器,主要作用是做词法的分解和语法解析,词法解析是将一条SQL语句根据关键字等进行分词将SQL分成多个部分,语法解析是检查SQL语句中的语法是否有误,比如引号是否闭合等,最终在这一步会生成一颗解析树。
4.预处理器,如果查询了不存在的表或者字段这些在词法和语法上并没有错误的SQL,会在预处理器中对生成的解析树进行语义检查则会报错。
5.我们知道MySQL得到查询SQL语句后并不会直接按照我们写的SQL语句执行,它会将得到的SQL生成多种可执行的方案,然后采用算法挑选出其中开销最小的方案进行执行,如果要查看MySQL生成了哪些执行计划最终选择了哪种计划执行,首先设置开启执行计划跟踪:set optimizer_trace='enabled=on';执行查询语句,再通过select * from information_schema.optimizer_trace;可以查看优化器优化的信息;结果是JSON格式的数据主要分为了准备阶段,优化阶段和执行阶段:
上图我执行的SQL比较简单没进行多的优化,一条复杂的SQL比如选定哪张表作为基础表等等,开启优化后查询的结果中TRACE字段steps中应当有
expanded_query表示优化后的语句,
considered_execution_plans中列出了所有的执行计划。
6.执行引擎通过调用存储引擎的API完成SQL的执行获取返回结果,如果开启了缓存也会将结果写入缓存中。
mysql批量查询返回不存在_MySQL查询SQL流程,你造吗?
最新推荐文章于 2024-01-12 23:21:18 发布