当前位置: 首页 > news >正文

医院做网站运维浏览器打开是2345网址导航

医院做网站运维,浏览器打开是2345网址导航,建设项目环境影响评价公示网站,教做糕点的视频网站执行一条 SQL 查询语句,期间发生了什么? 连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 …

执行一条 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    //手动断开空闲的连接

(1)MySQL 定义了空闲连接的最大空闲时长,由 wait_timeout 参数控制的,默认值是 8 小时(28880秒),如果空闲连接超过了这个时间,连接器就会自动将它断开。

(2)MySQL 服务支持的最大连接数由 max_connections 参数控制,比如我的 MySQL 服务默认是 151 个,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。

(3)MySQL 的连接也跟 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

http://www.dt0577.cn/news/1940.html

相关文章:

  • 河间做网站的电话免费的网站推广
  • 开发一个公众号需要多少钱seo应该怎么做
  • icp主体备案号 网站备案号浏览器下载
  • wordpress 积分购物北京网站优化哪家好
  • 成都网站建设名录bt磁力搜索引擎索引
  • 完善wordpressseo的目的是什么
  • hge网站做微端凡科网站官网
  • wordpress新建php页面模板seo优化技术培训
  • 淄博网站建设至信网络在线代理浏览网页
  • 优质的天津网站建设网络营销带来的效果
  • 成都游戏开发网站关键词优化排名软件
  • 汕头 做网站深圳推广优化公司
  • wordpress word文档360网站关键词排名优化
  • 内江住房和城乡建设厅网站网络营销的四大要素
  • 网站视频插件怎么做佛山网站建设工作
  • 拿品牌做网站算侵权吗优化设计答案五年级下册
  • 宿迁网站建设介绍公司今日预测足球比分预测
  • 世界服装鞋帽网免费做网站企业网站优化解决方案
  • 微网站如何做微信支付宝支付宝支付接口网络营销推广平台有哪些
  • 淮北刚刚发生的事山东seo
  • 老会计手把手教做帐官方网站seo短视频网页入口引流网站
  • 做博彩网站的虚拟空间免费网站seo排名优化
  • 腾讯企业邮箱忘记密码廊坊快速优化排名
  • 外围网站代理怎么做企业培训平台
  • 本科生做网站编辑还有哪些平台能免费营销产品
  • 做网站要收订金吗如何建网站要什么条件
  • 用vue做的网站怎么实现响应式网络培训研修总结
  • 做网站要不要35类商标广告策划书
  • 免费网站推广文章免费建站模板
  • 天津武清做网站广州网站到首页排名