mysql 慢查询过多_MySQL 慢查询优化

为什么查询速度会慢

1.慢是指一个查询的响应时间长。一个查询的过程:

  • 客户端发送一条查询给服务器
  • 服务器端先检查查询缓存,如果命中了缓存,则立可返回存储在缓存中的结果。否则进入下一个阶段
  • 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。
  • MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。
  • 将结果返回给客户端

2.数据访问

  • 是否向数据库请求了不需要的数据
  • 是否扫描额外的记录

3.查询的方式

  • 一个复杂的查询还是多个简单的查询
  • 切分查询(将大查询切分成小查询,循环完成小查询)
  • 分解关联查询

慢查询分析

问题SQL

把复杂的SQL分成多个简单SQL并执行,查看具体那个字段会慢,区分度不高。

EXPLAIN

显示SQL如何使用索引的执行计划。

执行计划的参数:

table 显示这一行的数据是关于哪张表的

type 显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len 使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref 显示索引的哪一列被使用了,如果可能的话,是一个常数

rows 扫描请求数据的行数

Extra 关于MYSQL如何解析查询的额外信息

PROFILE

显示SQL执行消耗系统资源的信息。

查询执行的过程

MySQL客户端/服务器通信协议是“半双工”的。客服端/服务器端都可以向对方发送数据,但不能同时发生。所以我们无法也无须将一个消息切成小块独立来发送。
这种协议没办法进行流量控制。
客户端发送请求的数据包大小由参数max_allowed_packet限制。如果查询太大,服务端会拒绝接受更多的数据并抛出相应的错误。
服务器端返回的多个数据包,客户端必须完整接受。

1.查询状态 SHOW FULL PROCESSLIST 

mysql>SHOW FULL PROCESSLIST;Id  User    Host             db            Command    Time  State   Info                   
------  ------  ---------------  ------------  -------  ------  ------  -----------------------1  root    localhost:61316  laravel_blog  Query         0  (NULL)  show FULL processlist  2  root    localhost:61319  (NULL)        Sleep        94          (NULL)

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

2.查询缓存

-- 查看缓存是否开启 (query_cache_type 为 ON 表示已经开启
mysql> show variables like '%query_cache%'; +------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 20971520 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

检查sql是否命中缓存。命中则检查一次用户权限后返回,这个检查是通过一个对大小写敏感的哈希查找实现的。两次查询只要有一个字节的不同就会失败。否则将进入下一个阶段。

当sql中有不确定的数据时,则不会被缓存。例如用户自定义函数、存储函数、用户变量、临时表、mysql库中的系统表,其查询结果都不会被缓存。

3.查询优化

语法解析器和预处理

      MySQL通过关键字将sql语句进行解析,并生成一颗对应的解析树。这个过程解析器主要通过语法规则来验证和解析。比如sql中是否使用了错误的关键字或者关键字的顺序是否正确等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等。

查询优化器

经过前面的步骤生成的语法树被认为是合法的了,并且由优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。

MySQL使用基于成本的优化器,通过计算成本选择其中最小的一个。通过SHOW STATUS LIKE 'Last_query_cost';查看成本。成本的最小单位是随机读取一个4K数据页的成本。

MySQL的查询优化器是一个非常复杂的部件,它使用了非常多的优化策略来生成一个最优的执行计划:

      • 重新定义关联表的顺序
      • 将外连接转化成内连接
      • 使用等价变换规则
      • 优化count()、min()、max()
      • 预估并转化为常数表达式
      • 覆盖索引描述
      • 子查询优化
      • 提前终止查询
      • 等值传播
      • 列表IN()的比较    

上面列举了一些,随着MySQL的不断发展,优化器使用的优化策略也在不断的进化。 

查询执行引擎

在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令逐步执行得出结果。整个执行过程的大部分操作均是通过调用存储引擎实现的接口来完成,这些接口被称为handler API。

查询过程中的每一张表由一个handler实例表示。实际上,MySQL在查询优化阶段就为每一张表创建了一个handler实例,优化器可以根据这些实例的接口来获取表的相关信息,包括表的所有列名、索引统计信息等。存储引擎接口提供了非常丰富的功能,但其底层仅有几十个接口,这些接口像搭积木一样完成了一次查询的大部分操作。

返回结果

查询执行的最后一个阶段就是将结果返回给客户端。即使查询不到数据,MySQL仍然会返回这个查询的相关信息,比如该查询影响到的行数以及执行时间等。

如果查询缓存被打开且这个查询可以被缓存,MySQL也会将结果存放到缓存中。

结果集返回客户端是一个增量且逐步返回的过程。有可能MySQL在生成第一条结果时,就开始向客户端逐步返回结果集了。这样服务端就无须存储太多结果而消耗过多内存,也可以让客户端第一时间获得返回结果。需要注意的是,结果集中的每一行都会以一个满足①中所描述的通信协议的数据包发送,再通过TCP协议进行传输,在传输过程中,可能对MySQL的数据包进行缓存然后批量发送。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>视频、面试文档免费获取

或 者关注我每天分享技术文章

PHP架构师之路​www.zhihu.com
b418ef6e2a22d4b8e0a5a67b8bb1652f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...

谷歌现在越来越不按常理出牌了,今天早些时候,他们已经提前秀出了Android 7.0。从最新亮相的Android N开发者预览版来看,谷歌进行了一些调整,但更重要的是,增加了一些新的功能,比如分屏、新的通知控制等。那…

iOS-模糊查询

http://blog.csdn.net/qq_33701006/article/details/51836914 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[] 前言: 为了巩固FMDB,就来找个简单的Demo学习一下。不好找工作啊,就学习吧,没应聘的消遣吧。 简单介…

钱币掉落动画android,mpvue实现小程序签到金币掉落动画(api实现)

这里使用小程序自带的api来实现,用小程序来写动画的恶心点在于,没有帧,只能用setimeout 来作为帧来使用,下面是实现代码, 下面是简单用div代替了图片,需要什么图片,可以自行替换相应的div即可需…

前端学习(2197):__WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor

在使用vuex过程中,发现报错 typeError:__WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor 经查找发现是实例化时 .store用的小写造成的,如下 new Vuex.store({state:{},mutations:{},actions:{},modules:{} }) 实际应为大写!(居然有和…

android特殊代码,安卓手机输入这些特殊代码,电池状态查得清清楚楚!

原标题:安卓手机输入这些特殊代码,电池状态查得清清楚楚!智能手机在很大程度上方便了我们的生活,但是我们也逐渐依赖上了手机,想更了解自己的手机,知道自己到底在手机哪些地方花费了多少时间吗,…

android 三星 白色,时尚实用都拥有 白色Android手机盘点

唯美大气:三星I9000三星I9000的高人气不用多说,许多人在看过了黑色之后也等待着白色版本的上市。而在上周该机的白色版本也终于到来,赶在圣诞节之前为我们提供了多一种的白色Android机型选择。从图片中可以看出I9000机身正面依旧为黑色&#…

见微知著(一):解析ctf中的pwn--Fast bin里的UAF

在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的。所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家参考和一起交流。当然,也不想搞…

火狐插件 打开html 死机,火狐flash插件崩溃(Firefox火狐Flash插件卡死问题完美解决方法)...

火狐flash插件崩溃(Firefox火狐Flash插件卡死问题完美解决方法),哪吒游戏网给大家带来详细的火狐flash插件崩溃(Firefox火狐Flash插件卡死问题完美解决方法)介绍,大家可以阅读一下,希望这篇火狐flash插件崩溃(Firefox火狐Flash插件卡死问题完…

uuid表示时间的部分_技术译文 | UUID 很火但性能不佳?今天我们细聊一聊

作者:Yves Trudeau Yves 是 Percona 的首席架构师,专门研究分布式技术,例如 MySQL Cluster,Pacemaker 和 XtraDB cluster。他以前是 MySQL 和 Sun 的高级顾问。拥有实验物理学博士学位。原文链接:https://www.percona.…

西电计算机科学院实践中心,计算机基础教学实验中心

一、总体情况计算机基础教学实验中心隶属于计算机网络与信息安全国家级实验教学示范中心,承担着全校本科生的计算机基础教学和实验任务,是学校对外的重要窗口。中心总面积4200平方米,固定资产总价值接近1500万元,仪器设备共3907台…

jquery通过attr取html里自定义属性原来这么方便啊

<script type"text/javascript"> function fangGouWuChe(obj) { //放入购物车 var sMat $(obj).parent().parent().parent().parent().attr("material"); var sPrice $(obj).parent().parent().find(em[class"sale-price"]).text(); …

千牛通知栏常驻是什么意思_店铺运营|内贸1688 店铺真正的权重是什么?

想必大家都听说过店铺权重/单品权重/客户标签 这些名词。那到底是怎么操作的呢&#xff1f; 以下是简单的大纲&#xff1a;店铺权重的拆解拆分里面的小指标&#xff0c;看看我们有没有操作的空间单品的权重拆分里面的小指标&#xff0c;有哪些因素是我们能够控制的&#xff1f;…

charts引入icon图片_v-charts 踩坑之路

最近要做一个大屏 没有使用echarts 使用了更适合vue封装的v-charts组件库&#xff0c;第一次使用 期间踩了不少坑&#xff0c;记录下来和大家分享一下。废话不多说 开始搞起来&#xff01;一、安装 引入什么的大家自行百度 百度一下&#xff0c;你就知道​www.baidu.com二、2.1…

pla3d打印材料密度_模具粉必看!总有一款粉末能解决您的问题-毅速3D打印研制...

金属3D打印最常见的形式是粉末床熔融。这类工艺使用热源&#xff08;SLM工艺使用激光&#xff0c;EBM工艺使用电子束&#xff09;逐点将粉末颗粒熔融在一起&#xff0c;逐层加工至物件完成。在金属3D打印过程中&#xff0c;可能存在很多设备操作者试图避免的问题&#xff0c;包…

【Networking】容器网络大观 SDN 资料汇总

SDNLAB技术分享&#xff08;十五&#xff09;&#xff1a;容器网络大观SDNLAB君 • 16-06-17 •2957 人围观编者按&#xff1a;本文系SDNLAB技术分享系列&#xff0c;本次分享来自SDN撕X群&#xff08;群主&#xff1a;大猫猫&#xff09;群直播&#xff0c;我们希望通过SDNLAB…

java 建立ssh隧道_SSH基础

SSH基本概念SSH 为 Secure Shell 的缩写&#xff0c;由 IETF 的网络小组&#xff08;Network Working Group&#xff09;所制定&#xff1b;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有…