mysql批量查询返回不存在_MySQL查询SQL流程,你造吗?

MySQL是工作中用的最多最广的数据库,我们日常的工作CRUD最终都是在写SQL或者优化SQL,当然简单的SQL现在市面上的ORM框架都能处理,比如MyBatis-Plus,那么我们在使用ORM框架或者原生JDBC操作数据库时,数据库究竟是怎么处理我们的SQL语句的呢? 大致可以分为以下几个步骤:

6931adff47e01c45a5f412873e1ff592.png

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';查看

ba213325b2eaf12976bd20869610783b.png

大小是4M,说明客户端的SQL语句大小和MySQL服务器应答的数据一次性的大小不能超过4M,警惕使用SQL查询时结果尽量要limit,批量插入时一次性value不能太多。 2.检查缓存器中是否有该sql语句执行的结果缓存有的话直接返回,这个功能很鸡肋,限制很大,当我们查询的SQL含有不一样的空格数即使sql语义一样,或者查询的table数据有写入操作都会导致缓存失效,因此MySQL也在16年发布的8.0版本中去掉了查询缓存器。 3.解析器,主要作用是做词法的分解和语法解析,词法解析是将一条SQL语句根据关键字等进行分词将SQL分成多个部分,语法解析是检查SQL语句中的语法是否有误,比如引号是否闭合等,最终在这一步会生成一颗解析树。

602399606ff059700fc57380bfe64928.png

4.预处理器,如果查询了不存在的表或者字段这些在词法和语法上并没有错误的SQL,会在预处理器中对生成的解析树进行语义检查则会报错。 5.我们知道MySQL得到查询SQL语句后并不会直接按照我们写的SQL语句执行,它会将得到的SQL生成多种可执行的方案,然后采用算法挑选出其中开销最小的方案进行执行,如果要查看MySQL生成了哪些执行计划最终选择了哪种计划执行,首先设置开启执行计划跟踪:set optimizer_trace='enabled=on';执行查询语句,再通过select * from information_schema.optimizer_trace;可以查看优化器优化的信息;结果是JSON格式的数据主要分为了准备阶段,优化阶段和执行阶段:

78edb0e5433c3f83f3b90fcd9580ca55.png

上图我执行的SQL比较简单没进行多的优化,一条复杂的SQL比如选定哪张表作为基础表等等,开启优化后查询的结果中TRACE字段steps中应当有 expanded_query表示优化后的语句, considered_execution_plans中列出了所有的执行计划。 6.执行引擎通过调用存储引擎的API完成SQL的执行获取返回结果,如果开启了缓存也会将结果写入缓存中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值