网站开发程序的移交,宁波市建设网,wordpress 空两格,网站开发团队排行榜执行一条 SQL 查询语句#xff0c;期间发生了什么#xff1f;
连接器#xff1a;建立连接#xff0c;管理连接、校验用户身份#xff1b;查询缓存#xff1a;查询语句如果命中查询缓存则直接返回#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块#xff1b;解析 …
执行一条 SQL 查询语句期间发生了什么
连接器建立连接管理连接、校验用户身份查询缓存查询语句如果命中查询缓存则直接返回否则继续往下执行。MySQL 8.0 已删除该模块解析 SQL通过解析器对 SQL 查询语句进行词法分析、语法分析然后构建语法树方便后续模块读取表名、字段、语句类型执行 SQL执行 SQL 共有三个阶段 预处理阶段检查表或字段是否存在将 select * 中的 * 符号扩展为表上的所有列。优化阶段基于查询成本的考虑 选择查询成本最小的执行计划执行阶段根据执行计划执行 SQL 查询语句从存储引擎读取记录返回给客户端 一、MySQL的架构两层
Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现主要包括连接器查询缓存、解析器、预处理器、优化器、执行器等。另外所有的内置函数如日期、时间、数学和加密函数等和所有跨存储引擎的功能如存储过程、触发器、视图等。都在 Server 层实现。存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎不同的存储引擎共用一个 Server 层。 二、Server层
1.连接器
连接MySQL服务与客户端进行TCP三次握手因为 MySQL 是基于 TCP 协议进行传输的
# -h 指定 MySQL 服务得 IP 地址如果是连接本地的 MySQL服务可以不用这个参数
# -u 指定用户名管理员角色名为 root
# -p 指定密码如果命令行中不填写密码为了密码安全建议不要在命令行写密码就需要在交互对话里面输入密码
mysql -h$ip -u$user -p
校验客户端的用户名和密码如果用户名或密码不对则会报错如果用户名和密码都对了会读取该用户的权限保存然后后面的权限逻辑判断都基于此时读取到的权限
show processlist //查看 MySQL 服务被多少个客户端连接
kill connection id //手动断开空闲的连接
1MySQL 定义了空闲连接的最大空闲时长由 wait_timeout 参数控制的默认值是 8 小时28880秒如果空闲连接超过了这个时间连接器就会自动将它断开。
2MySQL 服务支持的最大连接数由 max_connections 参数控制比如我的 MySQL 服务默认是 151 个,超过这个值系统就会拒绝接下来的连接请求并报错提示“Too many connections”。
3MySQL 的连接也跟 HTTP 一样有短连接和长连接的概念。
// 短连接
连接 mysql 服务TCP 三次握手
执行sql
断开 mysql 服务TCP 四次挥手// 长连接
连接 mysql 服务TCP 三次握手
执行sql
执行sql
执行sql
....
断开 mysql 服务TCP 四次挥手
使用长连接的好处就是可以减少建立连接和断开连接的过程所以一般是推荐使用长连接。
但是使用长连接后可能会占用内存增多因为 MySQL 在执行查询过程中临时使用内存管理连接对象这些连接对象资源只有在连接断开时才会释放。如果长连接累计很多将导致 MySQL 服务占用内存太大有可能会被系统强制杀掉这样会发生 MySQL 服务异常重启的现象。 解决长连接占用内存的问题 有两种解决方式。
第一种定期断开长连接。既然断开连接后就会释放连接占用的内存资源那么我们可以定期断开长连接。
第二种客户端主动重置连接。MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口注意这是接口函数不是命令那么当客户端执行了一个很大的操作后在代码里调用 mysql_reset_connection 函数来重置连接达到释放内存的效果。这个过程不需要重连和重新做权限验证但是会将连接恢复到刚刚创建完时的状态。 2.查询缓存
MySQL 服务收到 SQL 语句后就会解析出 SQL 语句的第一个字段看看是什么类型的语句。如果 SQL 是查询语句select 语句MySQL 就会先去查询缓存 Query Cache 里查找缓存数据看看之前有没有执行过这一条命令这个查询缓存是以 key-value 形式保存在内存中的key 为 SQL 查询语句value 为 SQL 语句查询的结果。如果查询的语句命中查询缓存那么就会直接返回 value 给客户端。如果查询的语句没有命中查询缓存中那么就要往下继续执行等执行完后查询的结果就会被存入查询缓存中。 查询缓存挺鸡肋 对于更新比较频繁的表查询缓存的命中率很低的因为只要一个表有更新操作那么这个表的查询缓存就会被清空。如果刚缓存了一个查询结果很大的数据还没被使用的时候刚好这个表有更新操作查询缓冲就被清空了相当于缓存了个寂寞。 所以MySQL 8.0 版本直接将查询缓存删掉了也就是说 MySQL 8.0 开始执行一条 SQL 查询语句不会再走到查询缓存这个阶段了。 对于 MySQL 8.0 之前的版本如果想关闭查询缓存我们可以通过将参数 query_cache_type 设置成 DEMAND。 3.解析器
词法分析识别关键字语法分析检查语法是否正确然后构建SQL语法树 4.执行SQL
4.1 预处理器
检查 SQL 查询语句中的表或者字段是否存在将 select * 中的 * 符号扩展为表上的所有列
4.2 优化器
将 SQL 查询语句的执行方案确定下来比如在表里面有多个索引的时候优化器会基于查询成本的考虑来决定选择使用哪个索引。
4.3 执行器
在执行的过程中执行器就会和存储引擎交互了交互是以记录为单位的。
有三种方式执行
主键索引查询全表扫描索引下推 三、参考
小林 coding