mysql执行流程和阶段分析

mysql的执行流程

在这里插入图片描述

一、mysql客户端/服务端通信

mysql客户端与服务端的通信方式是半双工

通信的特点和限制:
客户端一旦开始发送消息另一端要接收完整个消息才能响音.
客户端一旦开始接收数据不能停下来发送指令

通信的连接状态

对于一个mysql连接,或者说是一个线程,时刻都有一个状态来标识这个连接正在做什么
查看命令 show full processlist / show processlist
Sleep: 线程正在等待客户端发送数据
Query: 连接线程正在执行查询
Locked: 线程正在等待表锁的释放
Sorting result: 线程正在对结果进行排序
Sending data: 向请求端返回数据

对于出现问题端连接可通过kill{id}的方式进行杀掉

二、查询缓存

工作原理:
缓存select操作的结果集和sql语句
新的select语句,先去查询缓存,判断是否存在可用的记录集

判断标准:
与缓存的sql语句,是否完全一样,多一个空格都不能够命中

缓存的参数

缓存的设置参数

在这里插入图片描述

可以用如下命令查看是否开启,其中have_query_cache为是否开启,query_cache_limit 指定单个查询能够使用的缓冲区大小,缺省为1M;query_cache_min_res_unit为系统分配的最小缓存块大小,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据 查询,就容易造成内存碎片和浪费;
其中query_cache_size表示缓存的大小,而query_cache_type有3个值,表示缓存那种类 型的select结果集,query_cache_type各个值如下:
0或off关闭缓存
1或on开启缓存,但是不保存使用sql_no_cache的select语句,如不缓存select sql_no_cache name from leyangjun where id=20;
2或demand开启有条件缓存,只缓存带sql_cache的select语句,缓存select sql_cache name from leyangjun where id=40;
query_cache_wlock_invalidate表示当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。

缓存的命中情况

在这里插入图片描述
其中各个参数的意义如下:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。

不会缓存的情况

1.当查询语句中有一些不确定的数据时,则不会被缓存.如包含函数NOW(),CURRENT_DATE()等类似的函数,或者用户自定义的函数,存储函数,用户变量等都不会被缓存
2.当查询的结果大于query_cache_limit设置的值时,结果不会被缓存
3.对于InnoDB引擎来说,当一个语句在事物中修改来某个表,那么在这个事务提交之前,所有与这个表相关的查询都无法被缓存.
4.查询系统表不会被缓存
5.查询语句不涉及表

mysql是默认关闭缓存的.针对表进行写入或更新数据时,对应表的所有缓存都设置失效,已经不推荐使用

三、查询优化处理

查询优化又分为三个阶段:

  • 解析sql: 通过lex词法分析,yacc语法分析将sql语句解析成解析树
  • 预处理阶段: 根据mysql的语法的规则进一步检查解析树的合法性.如:检查数据的表和列是否存在,解析名字和别名的设置,进行权限的验证
  • 查询优化器: 优化器的主要作用就是找到最优的执行计划

如何找到最优的执行计划

  • 使用等价变化规则
  • 将可转换的外连接查询转换成内连接查询
  • 优化count、min、max等函数
  • 覆盖索引扫描
  • 子查询优化
  • 提前终止查询
  • IN的优化

    mysql的查询优化器是给予成本计算原则.它会尝试各种执行计划.如要数据抽样进行试验,随机的读取一个4k的数据块进行分析

执行计划

id:
在这里插入图片描述
table:
在这里插入图片描述

type:
在这里插入图片描述
其他:
在这里插入图片描述
Extar:
在这里插入图片描述

四、查询执行引擎

调用插件式的存储引擎的原子API的功能进行执行计划的执行

五、返回客户端

  1. 有需要做缓存的,执行缓存操作
  2. 开始生成第一条结果时,mysql就开始往请求方逐步返回数据
    好处:mysql服务器无需保存过多的数据,浪费内存,用户体验好,马上就拿到了数据
发布了17 篇原创文章 · 获赞 0 · 访问量 248

猜你喜欢

转载自blog.csdn.net/weixin_40980639/article/details/104425424