一条SQL查询语句是怎么执行的

一条SQL查询语句是怎么执行的

MySQL是用C++语言编写,架构模式是C/S架构,可以将MySQL服务端分为Server层和存储引擎层。Server层包括连接器、查询缓存、分析器、预处理器、优化器、执行器等,提供MySQL的大多数核心功能,像MySQL的内置函数(日期函数、数学函数等),跨存储引擎的功能,比如(存储过程、触发器、视图)都是在Server层实现。而存储引擎层负责数据的存储和提取,支持InnoDB、MyISAM、Memory等多个存储引擎,不同的存储引擎表数据的存取方式不同,支持的功能也不同,但它们可以共用一个Server层,从MySQL5.5.5版本后InnoDB已经成为默认的存储引擎。
以执行select * from user where user_id=10这条SQL查询语句为例:
连接器
首先,在mysql客户端工具的命令行中输入mysql -h$目标主机ip地址 -p$端口号 -u$MySQL用户名 -p,然后在交互命令行输入密码(可以防止密码泄露),当MySQL客户端和服务端完成TCP握手后,MySQL服务端会校验用户名和密码,校验不通过,服务端会返回给客户端错误信息;校验成功,连接器会从mysql库中的user表查出对应的权限,之后客户端通过这个连接发起所有的操作,服务端都会根据此时得到的权限进行判断。即使后来管理员更改了这个用户的权限,服务端还是根据连接时得到的权限进行权限判断。mysql连接分长连接和短连接,长连接是指客户端后续发来的请求都在这个连接中执行,短连接是指客户端后续发来的请求执行几次就断开这次连接,然后新建一个连接执行。因为建立连接是一个复杂的操作,所有推荐使用长连接。但MySQL在执行过程中临时使用的内存是管理在连接对象中,这些内存只有在连接断开时才会释放。所以长连接太多或者一直不断开,可能会导致内存占用过大,被系统强行杀掉。所以可以采用定时断开长连接或者使用mysql_reset_connection函数(MySQL5.7及之后的版本)初始化连接资源策略来避免。空闲连接在超过wait_time后系统会自动断开,可以执行show processlist命令查看所有的连接。
查询缓存
MySQL执行查询语句后,会以键值对的形式把查询语句和查询结果放到查询缓存中。所有MySQL执行查询语句前,会先到查询缓存中看看有没有对应的结果,有直接返回,没有按流程查询。MySQL8.0及之后的版本已经删除了这个模块,因为查询缓存的命中率太低,当对一张表有一次更新操作,这张表上的查询缓存就会被清空。所以查询缓存适合于很少更新的静态表,比如系统配置表。
分析器
MySQL会先进行词法分析,将SQL语句中的关键字识别出来,然后进行语法分析,判断是否满足MySQL的语法规则。
预处理器
在执行SQL前,MySQL会检查SQL中表或字段是否在数据库存在。
优化器
MySQL会选择使用哪一个索引以及决定表的连接顺序。
执行器
MySQL会先判断用户是否对这个表有操作权限,有的话,MySQL会调用存储引擎接口获取数据,然后返回数据给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值