当前位置:首页 > 数据库 > linux查看mysql

linux查看mysql

2022年11月09日 10:36:30数据库6

当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式运行

当我们想向MySQL发送了一个请求时,MySQL到底做了什么:

linux查看mysql _ JavaClub全栈架构师技术笔记

客户端首先发送一条查询请求给服务器

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

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

MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询

将结果返回客户端

MySQL客户端/服务器通信协议

MySQL客户端和服务器之间的通信协议是“半双工”的,这意味着,在任何一个时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。所以,我们无法也无需将一个消息切成小块独立来发送。

这种协议虽然让MySQL通信简单快速,但是也从很多地方限制了MySQL。一个明显的限制是,这意味着没法进行流量控制。一旦一端开始传送信息,另一端要接收完整个信息才能够响应它。

客户端使用一个单独的数据包将查询传给服务器,当查询语句太长时,服务端就会拒绝接受更多的数据并且抛出相应的错误。因此,当查询语句很长时,参数max_allowed_packet就特别重要。

相反的,一般服务器响应给用户的数据通常很多,由多个数据包组成。当服务器开始相应客户端请求时,客户端必须完整的接受整个返回结果,而不能简单的只取前几条结果。

换而言之,当客户端从服务器获取数据时,MySQL会一直向客户端推送数据,客户端也没法让服务器停下来。

查询状态

对于一个MySQL连接或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么:

Sleep: 线程正在等待客户端发送新的请求

Query: 线程正在执行查询或者正在将结果发送给客户端

Locked: 在MySQL服务器层,该线程正在等待表锁

Analyzing and statistics: 线程正在收集存储引擎的统计信息,并生成查询的执行计划

Copying and tmp table [on disk]: 线程正在执行查询,并将其结果集都复制到一个临时表中,这种状态要么就是在做GROUP BY 操作,要么就是文件排序操作。如果这个状态后面还有 on disk标记,那么表示MySQL正在将一个内存临时表存放在磁盘上

Sorting result: 线程正在对结果集进行排序

Sending data: 这表示多种情况:线程可能在多个状态之间传送数据,或者生成结果集,或者在向客户端返回数据

查询缓存

在解析一个查询语句之前,如果查询缓存是打开的,那么MySQL会优先检查这个查询是否命中查询缓存中的数据,这个检查是通过一个对大小写敏感的哈希查找实现的。

查询和缓存中的查询即使只有一个字节不同,也不会匹配缓存结果。这种情况下查询就会进入下一个阶段。

如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前MySQL会检查一次用户权限。这仍然是无需解析查询SQL语句的,因为在查询缓存中已经存放了当前查询所需要访问的表信息。

如果权限没有问题,MySQL就会跳过所有其他阶段,直接从缓存表中拿到结果并且返回给客户端。在这种情况下,查询不会被解析,不用生成执行计划,不会被执行。

[yiij]查询优化处理[/yiji]

查询的生命周期的下一步是将一个SQL转换成一个执行接话,MySQL再按照这个执行计划和存储引擎进行交互。

这包括多个子阶段:解析SQL、预处理、优化SQL执行接话。

这些过程中任何出错都可能终止查询。

查询执行引擎

在解析和优化阶段,MySQL将会生成查询对应的执行接话,MySQL的查询执行引擎则根据这个执行计划来完成整个查询。这里的执行计划是一个数据结构,而不是其他很多关系型数据库那样的字节码。

相对于查询优化阶段,查询执行阶段并不那么复杂:MySQL只是简单的根据执行计划给出的指令逐步执行。在根据执行计划逐步执行的过程中,有大量的操作需要通过调用存储引擎实现的接口来完成。

返回结果给客户端

查询执行的最后一个阶段是将结果返回给客户端。及时查询不需要返回结果给客户端,MySQL仍然会返回这个查询的信息,如该查询影响到的行数。

在这个阶段中,如果查询是可以被缓存的,那么MySQL在这个阶段也将会被存放到查询缓存中。

MySQL将结果集返回给客户端是一个增量地、逐步返回的过程。这样做有两个好处:服务器端无需存储太多的结果,也就不会因为要返回太多结果而消耗太多内存。这样的处理也会让MySQL客户端第一时间获得返回的结果。

结果集中的每一行都会以一个满足MySQL客户端/服务器通信协议的封包发送,再通过TCP协议进行传输,在TCP传输中,可能会对MySQL的封包进行缓存然后批量传输。

作者:负智年帖
来源链接:https://blog.csdn.net/weixin_30610943/article/details/113117331

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68710.html

标签: MySQL
分享给朋友:

“linux查看mysql” 的相关文章

MySQL安装之yum安装

MySQL安装之yum安装

 在CentOS7中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1. 下载并安装MySQL官方的 Yum Repository [root@Bria...

MySQL索引是如何提高查询效率的呢?

MySQL索引是如何提高查询效率的呢?

About MySQL MySQL(读作/maɪ ˈsiːkwəl/“My Sequel”)是一个开放源码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,目前为Oracle旗下产品。 被甲骨文公司收购后,自由软件社群们对于Orac...

MySQL 查询指定时间范围内的数据

  说明 mysql 比较时间范围可以直接用 >=、<= 等比较运算符,也可以用 between and(两边都包含,都是闭区间);比较运算符更常用,因为 between and 能做的比较运算符也能做, bet...

mysql 查询最近5个月,每月的数据统计

SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `year_month` UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), '%Y-%m') AS `year_month...

mysql查询条件为不等于某个值时,null 查询不到?

mysql 当查询是条件为 where status != ‘1’ 时 当status 为null时查询不到 的坑 今天又碰到了这坑 我要查询status !=‘1’ 的所有数据,数据库中符合要求有17条,可是查询结果只返回了7条,当时就很纳闷,经...

shell简单处理mysql查询结果

首先理清要了解shell脚本的数组与字符串的一些特性: str=("hello" "world" "!") #结果: str: 3 #普通的字符串数组 echo "str: " ${#str[@]} str1=("hello world !")...

mysql查询数据库表的数据行数

查看mysql某个数据库下所有表的数据总条数 use information_schema; select sum(TABLE_ROWS) from tables where TABLE_SCHEMA = 'db_name'; 查询出来的是...

Mysql查询用户最后一次登陆时间

Mysql查询用户最后一次登陆时间

类似的问题还有,学生得分最高的课程 数据库如下: 第一种方案: SELECT sid,max(add_time) from test GROUP BY sid 第二种方案 S...

mysql 查询一表在另一表中不存在的数据

左连接查询: select * from goods g LEFT JOIN goods_common gc on g.goods_commonid=gc.goods_commonid where gc.goods_commonid is null...

MySQL的查询优化——背后原理

MySQL的查询优化——背后原理

转载地址:https://www.jianshu.com/p/d7665192aaaf 说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真的理解这些优化技巧?是否理解其背后的工...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。