MySQL学习

MySQL了解

一、MySQL逻辑架构

  • 在MySQL各组件之间的逻辑架构图如下图所示:
    在这里插入图片描述
    客户端负责权限认证,连接,安全等
    服务层查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。
    存储层负责数据的存储以及提取

二、MySQL查询过程

  • mysql 查询过程可以用一张图来概述
    在这里插入图片描述
2.1 客户端与服务端协议
  • 在MySQL中,客户端与服务端的协议是半双工的,意思就是说当客户端向服务端发送查询请求的时候,服务端只有等到客户端请求发送完成之后,才能做出响应,所以,我们没办法将消息切块发送,无法进行流量控制
  • 当我们需要通过客户端发送大数据量的请求时候,我们需要设置MySQL中的max_allowed_packed这个参数,但是如果请求实在过大的时候,服务端依旧可能会拒绝客户端的大数据请求
  • 当服务端给客户端响应数据时候,我们也需要控制数据包的大小和数量来优化请求的响应速度,所以在很多SQL优化中,我们会建议尽量只查询需要的必须数据,通常或设置limit或者禁止select * 等方法
2.2 服务端查询缓存
  • 在MySQL查询过程中,我们可以去设置查询缓存。当我们客户端向服务端去发送一条查询语句时候,服务端在进行解析之前,会先去判断数据库缓存是否打开,如果打开,他会直接去撞击缓存,如果缓存命中,则会直接返回缓存中的数据。需要注意的是,在命中缓存之后,他还会去检查用户权限,然后才会返回
  • MySQL存储缓存的方式不是传统的table,而是类似于hashMap,存储的是hash值和数据,这个hash不是随机生成的,是根据查询语句,查询库等数据来计算出来的,所以当你的SQL中存在字段等变化时候,命中缓存的几率也会不一样
2.3 缓存失效
  • 缓存不是在任何时候都会有效的,当你的SQL中存在系统函数,类似NOW()等,又或者包含存储过程等等,在这种情况下,服务端会根据不同的请求数据来返回不同的请求数据,所以我们在进行SQL优化时候,对这类SQL数据进行缓存是没有任何意义的
  • 当缓存数据的表结构发生变化时候,那么在缓存中与这个表相关联的缓存就会全部失效。
  • 如果我们在对表数据进行写入操作的时候,缓存还有效,那么就会导致查询数据会出向脏读,所以我们在进行写操作时候,需要将表的缓存设置为失效状态,而且我们在任何时候都使用缓存的话,也会对系统性能带来影响
  • 关于缓存的建议
	用多个小表代替一个大表,注意不要过度设计

	批量插入代替循环单条插入

	合理控制缓存空间大小,一般来说其大小设置为几十兆比较合适

	可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存
2.4 MySQL语法解析以及优化
  • mysql在对客户端请求过来的语句进行解析时候,会生成一颗解析树,解析器会通过语法规则来验证和解析解析树,比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等等
  • 当解析器验证当前解析树为合法之后,便开始由优化器将其转化为执行计划,此时优化器的作用就是在众多查询计划中找到最优的执行计划
2.5 查询数据
  • 在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令逐步执行得出结果。整个执行过程的大部分操作均是通过调用存储引擎实现的接口来完成,这些接口被称为handler API。查询过程中的每一张表由一个handler实例表示。实际上,MySQL在查询优化阶段就为每一张表创建了一个handler实例,优化器可以根据这些实例的接口来获取表的相关信息,包括表的所有列名、索引统计信息等。存储引擎接口提供了非常丰富的功能,但其底层仅有几十个接口,这些接口像搭积木一样完成了一次查询的大部分操作
2.6 返回数据
  • 查询执行的最后一个阶段就是将结果返回给客户端。即使查询不到数据,MySQL仍然会返回这个查询的相关信息,比如该查询影响到的行数以及执行时间等等。
  • 如果查询缓存被打开且这个查询可以被缓存,MySQL也会将结果存放到缓存中。
  • 结果集返回客户端是一个增量且逐步返回的过程。有可能MySQL在生成第一条结果时,就开始向客户端逐步返回结果集了。这样服务端就无须存储太多结果而消耗过多内存,也可以让客户端第一时间获得返回结果。需要注意的是,结果集中的每一行都会以一个满足通信协议的数据包发送,再通过TCP协议进行传输,在传输过程中,可能对MySQL的数据包进行缓存然后批量发送
2.7 查询过程总结
客户端向MySQL服务器发送一条查询请求

服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段

服务器进行SQL解析、预处理、再由优化器生成对应的执行计划

MySQL根据执行计划,调用存储引擎的API来执行查询

将结果返回给客户端,同时缓存查询结果
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值