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,一经查实,立即删除!

相关文章

sqlserver获得到当前游标中存在的数据行数

Select CURSOR_ROWS 可以得到当前游标中存在的数据行数。 注意:此变量为一个连接上的全局变量,因此只对应最后一次打开的游标。

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

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

iOS-模糊查询

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

嵌入式操作系统一览

其实,嵌入式系统并不是一个新生的事物,从八十年代起,国际上就有一些IT组织、公司,开始进行商用嵌入式系统和专用操作系统的研发。这其中涌现了一些著名的嵌入式系统: Windows CEMicrosoft Windows CE是从整体上为有限资…

connect跨进程 qt_编写 Qt 跨线程异步调用器

本文使用 Zhihu On VSCode 创作并发布本文使用 CC BY-NC-SA 4.0 许可协议,转载请注明来源一、设计背景众所周知,Qt 的信号槽系统提供了线程安全的跨线程异步执行代码的机制(Qt::QueuedConnection)。使用该机制,可以让槽函数代码在另一个线程执…

Web开发入门疑问收集(不定期更新)

bootstrap container和container-fluid的区别 原始链接 container根据显示设备满足的最小宽度,来决定实际内容宽度,是一个根据设置内容阶梯式响应的布局。例子:media (min-width: 568px) {.container {width: 550px;} } media (min-width: 99…

钱币掉落动画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:{} }) 实际应为大写!(居然有和…

c常见错误

///Segmentation fault段错误可能有未初始化的变量导致段错误的几种情况1、 引用一个包含非法值的指针(当然包括空指针)。2、 未得到正确的权限的时候进行访问,例如往只读的内存地址写数据。3、 内存越界(数组越界,变量…

python学多久能写东西的软件有哪些_怎么自学python,大概要多久?

看完这些还不会算我输1、一小时Python 基础和编码规范鹅厂员工学习Python总结的教程,可用于快速了解Python,适合有其它语言编程基础的同学看,一个小时带你玩转Python2、400全集Python全套视频教程此套视频信息量非常大,我画了个思…

接口测试之HTTP协议详解

引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范…

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

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

C gdb调试工具

编译程序cc -g try.c -o try 一 列文件清单  List   (gdb) list line1,line2[编辑本段] 二&#xff1a;执行程序  要想运行准备调试的程序&#xff0c;可使用run命令&#xff0c;在它后面可以跟随发给该程序的任何参数&#xff0c;包括标准输入和标准输出说明符(<和&g…

python3 装饰器参数_Learn Python 3:装饰器

一、理解装饰器通俗点说&#xff0c;当我们想给一个函数增强额外的功能&#xff0c;但又不想修改原函数的定义&#xff0c;同时新增的功能其它函数可能也需要使用&#xff0c;装饰器就是来解决这种需求的&#xff0c;将与原函数功能无关的代码提取出来&#xff0c;实现复用&…

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

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

XidianOJ 1099 A simple problem

题目描述 一个长度为N的数组A&#xff0c; 所有数都是整数 &#xff0c;0 < A[i] < 1000000&#xff0c;1 < i < N&#xff0c;1 < N < 100000&#xff0c;对于 任意i&#xff0c;j &#xff0c;1 < i < j < N&#xff0c;[i&#xff0c; j]中所…

C字符操作函数大全

函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 "abcdefghi"; stpcpy(string, str1); …

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

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

python语言学完后学什么_学完Python语言可以做什么?发展前景怎么样?

Python是一门高级的编程语言&#xff0c;其语言功能强大、语法简单、上手容易&#xff0c;因此受到了不少人的喜欢。而对于学习一门语言&#xff0c;很多人最看重的就是&#xff0c;学习之后可以做什么?有哪些岗位?薪资待遇如何?为大家详细的讲解一下。Python是一门面向对象…