MYSQL进阶-查询优化- 实战 STATUS

回城传送–》《100天精通MYSQL从入门到就业》

文末有送书活动,可以参加!

文章目录

  • 一、练习题目
  • 二、SQL思路
    • SQL进阶-查询优化- SHOW STATUS
      • 初始化数据
      • 解法
        • SHOW STATUS是什么
        • 实战经验:常用的mysql状态查询
          • 1、QPS(每秒处理的请求数量)
            • 计算思路:
            • Questions和 Queries的区别
          • 2、TPS(每秒处理的事务数量)
            • 计算思路:
          • 3、key Buffer 命中率
          • 4、InnoDB Buffer命中率
          • 5、query cache命中率
          • 6 、table_cache(table_open_cache) 命中率
          • 6、thread cache命中率
            • 优化
          • 7、tmp table相关状况分析
          • 8、binlog cache
          • 9、innodb_log_waits
          • 10、锁状态
  • 三、总结
  • 四、参考
  • 五、粉丝福利
    • 福利0
    • 福利1
    • 福利2

一、练习题目

题目链接难度
SQL进阶-查询优化- SHOW STATUS★★★☆☆

二、SQL思路

SQL进阶-查询优化- SHOW STATUS

在这里插入图片描述

初始化数据

这里写入初始化表结构,初始化数据的sql

解法

SHOW STATUS是什么

SHOW STATUS 能获取mysql服务的一些状态,这些状态是mysql服务的性能参数!
语法:

SHOW [SESSION | GLOBAL] STATUS

SESSION表示获取当前会话级别的性能参数,GLOBAL表示获取全局级别的性能参数,并且SESSION和GLOBAL可以省略,如果省略不写,默认为SESSION。
b
在这里插入图片描述
参数很多,所以在查找指定参数时,可用以下语法:

SHOW [SESSION | GLOBAL] STATUS LIKE 'status_name';

其中status_name 为状态的参数名称。

实战经验:常用的mysql状态查询

1、QPS(每秒处理的请求数量)

QPS是mysql每秒所执行的sql数量,但不仅限于select 、instert、update和delete语句。

QPS = Questions(or Queries) / seconds

show global status like 'Question%';

在这里插入图片描述

 show global status like 'uptime_since_flush_status';

在这里插入图片描述

计算思路:

先从show global status like ‘Question%’; 得到Question1的数据,经过一段时间后,再计算show global status like ‘Question%’; ,得到Question2的数据。

QPS = (Question2-Question1)/(uptime_since_flush_status2-uptime_since_flush_status1)

Questions和 Queries的区别

在这里插入图片描述
因为 Queries 计数统计的更多,所以理论上 Queries 计数总是大于等于 Questions 计数。

Queries会比Questions 多统计存储过程语句和预准备语句。

2、TPS(每秒处理的事务数量)

TPS指的是每秒处理的事务数量,不包含select语句。

TPS = (Com_commit + Com_rollback) / seconds

show global status like 'Com_commit';show global status like 'Com_rollback';

字段说明:

Com_commit:事务提交数
Com_rollback:事务回滚数

对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。

在这里插入图片描述
在这里插入图片描述

计算思路:

先得到** (Com_commit + Com_rollback) ** 的值commit_rollback1,然后经过一段时间后,再得到** (Com_commit + Com_rollback) ** 的值commit_rollback2。
TPS = (commit_rollback2-commit_rollback1)/(uptime_since_flush_status2-uptime_since_flush_status1);

3、key Buffer 命中率

key buffer 命中率代表了​Myisam​类型表的索引cache命中率,命中率的大小直接影响myisam类型表的读写性能。
命中率过低,说明myisam类型表的读写存在问题。
key buffer 命中率实际上包括读命中率和写命中率两种,计算公式如下:

key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%

show global status like 'key%';

在这里插入图片描述

4、InnoDB Buffer命中率

innodb buffer 所指的是innodb_buffer_pool,也就是用来缓存innodb类型表和索引的内在空间。
命中率过低,说明innodb类型表的读写存在问题。
计算公式:
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%

show global  status like 'innodb_buffer_pool_read%';

在这里插入图片描述

5、query cache命中率

query cache 是mysql的查询cache,在my.cnf配置文件若打开,则可以对查询过的语句结果进行cache。
对于一些用户数不高或一次性统计平台建议关闭查询缓存。
若开启query cache,则对query cache 命中率进行监控也是需要的,它可以告诉我们是数据库是否在正确使用query cache。
计算公式:
query_cache_hits =(Qcache_hits/(Qcache_hits+Qcache_inserts))* 100%;

show global status like 'Qcache%';

在mysql5中,引入了query-cache的功能,query-cache默认是关闭的。
mysql建议我们用第三方的缓存技术,而不是用mysql本身的 query-cache去缓存数据,在mysql8也移除了query-cache

6 、table_cache(table_open_cache) 命中率

table_cache是一个非常重要的MySQL性能参数,table_cache主要用于设置table高速缓存的数量。在5.1.3之后的版本中叫做table_open_cache
由于每个客户端连接都会至少访问一个表,因此此参数的值与max_connections有关。
当mysql访问某个表时,若表缓存空间还有空间,则将该表就被打开并将数据放入其中,下次访问此表时可以更快的访问表的内容。
通过查峰值时间的状态值open_tables 和 opened_tables可以决定是否需要增加table_cache值。
需要注意的是table_cache设置很太高,可能会造成文件描述符不足,从而造成性能不稳定或是连接失败。

建议:状态量open_tables与opened_tables之间的比率要大于80%

open_tables与opened_tables之间的比率过低,则代表table cache设置过小。

show global status like 'open%_tables';

在这里插入图片描述
查看table_open_cache的值:

show global variables like 'table_open_cache';

修改table_open_cache 的值,方式如下:

  • 方式一:可以在my.ini或my.cnf里修改参数table_open_cache 的值。要重启mysql服务。
  • 方式二:在SET GLOBAL table_open_cache= 2000;这种方式不需要重启mysql服务。MySQL重启后会失效。
6、thread cache命中率

在mysql中,为了尽可能提高客户端连接的过程,实现 了一个thread cache池,将空闲的连接线程存放在其中,而不是请求完成后销毁,当有新的连接请求的时候,mysql首先检查thread cache是否存储空闲的连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的线程。
thread cache命中率能直接反应出系统参数thread_cache_size设置是否合理。一个合理的read_cache_size参数能够节约大量创建新连接时所需要消耗的资源。正常来说,​thread cache命中率在90% 以上才算合理​。

计算公式:

thread_cache_hits = (1- threads_created/connections) * 100 %;

show global status like 'Thread%';
show global status like 'Connections';

在这里插入图片描述
在这里插入图片描述
参数说明:

  • threads_created:表示创建过的线程数,很明显,threads_created过大,表明mysql服务器一直在创建线程,这也是比较耗资源,说明服务器不健康
  • Connections:连接MySQL服务器的次数。
优化

如果​thread cache命中率低于90%
查看thread_cache_size 的大小:

show global variables like 'thread_cache_size';

在这里插入图片描述
适当增加配置文件中thread_cache_size值,在my.cnf文件中直接加上thread_cache_size=64。
重启Mysql服务,配置生效。

或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。

set global thread_cache_size=30;
7、tmp table相关状况分析

tmp table 主要用于监控mysql使用临时表的量是否过多,是否有临时表过大而不得不从内存中换出到磁盘文件中

show global status like 'created_tmp%';

在这里插入图片描述

参数说明:

Created_tmp_disk_tables:为临时表过大无法在内存中完成,而不得不使用磁盘的次数。
若create_tmp_tables比较多,则可能排序句子过多,或者可能是连接方式不是很优化。
而如果是create_tmp_dis_table/create_tmp_tables比率过高,如超过10%,则需要考虑tmp_table_size参数是否需要调整大些。
建议tmp_table_size与max_heap_table_size需要设置成一样大。
在my.cnf文件中直接加上/调整tmp_table_size 的值。重启Mysql服务,配置生效。

或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。

set global tmp_table_size=自定义;

查看生效的配置:

show global variables like 'tmp_table_size';
show global variables like 'max_heap_table_size';

在这里插入图片描述
在这里插入图片描述

8、binlog cache

若打开binlog日志功能,则需要考虑binlog cache问题。binlog不是一有数据就写到binlog中,而是先写入到binlog cache中,再写入到binlog中。
Binlog_cache_disk_use为binlog使用硬盘使用量, Binlog_cache_use 为binlog已使用的量。若 Binlog_cache_disk_use大于0,则说明binlog_cache不够用,需要调大 binlog_cache_size大小。

show status like 'binlog_cache%';

在这里插入图片描述
在my.cnf文件中直接加上/调整binlog_cache_size 的值。重启Mysql服务,配置生效。

或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。

set global binlog_cache_size=自定义;

查看生效的配置:

show global variables like 'binlog_cache_size';

在这里插入图片描述

9、innodb_log_waits
show status like 'innodb_log_waits';

Innodb_log_waits值不等于0的话,表明 innodb log buffer 因为空间不足而等待。需要增加innodb_log_buffer_size的值,适当的增加不会造成内存不足的问题。
在这里插入图片描述
在my.cnf文件中直接加上/调整innodb_log_buffer_size 的值。重启Mysql服务,配置生效。

或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。

set global innodb_log_buffer_size=自定义;

查看生效的配置:

show global variables like 'innodb_log_buffer_size';

在这里插入图片描述

10、锁状态

mysql的锁有表锁和行锁,myisam最小锁为表锁,innodb最小锁为行锁,可以通过以下命令获取锁定次数、锁定造成其他线程等待次数,以及锁定等待时间信息。

 show status like '%lock%';

Table_locks_waited/Table_locks_immediate 的比值比较大的话,说明表锁造成的阻塞比较严重。可能需要调整Query语句,或者更改存储引擎,亦或者需要调整业务逻辑。

而Innodb_row_lock_waits较大,则说明Innodb的行锁也比较严重,且影响了其他线程的正常处理。
造成Innodb行锁严重的原因可能是Query语句所利用的索引不够合理(Innodb行锁是基于索引来锁定的),造成间隙锁过大。

三、总结

本文介绍了什么是SHOW STATUS,以及如何使用SHOW STATUS。分享了10个常用的mysql状态查询:

  • QPS(每秒Query量)
  • TPS(每秒事务数)
  • key Buffer 命中率
  • InnoDB Buffer命中率
  • query cache命中率
  • table_cache(table_open_cache) 命中率
  • tmp table相关状况分析
  • binlog cache
  • innodb_log_waits
  • 锁状态

所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。

四、参考

MySQL进阶技能树>查询优化> SHOW STATUS
如何计算 MySQL 的 QPS/TPS
MySQL调试–show status

五、粉丝福利

在这里插入图片描述
在这里插入图片描述

福利0

虚竹哥直接送1本好书,点赞数最高的好评~

  • 点赞数最高的好评送书:此文章的点赞数最高的好评送一本实体书《Java核心技术》(卷一或卷二 自选一本)

  • 统计截止时间:2023/08/10 19:00:00

福利1

虚竹哥直接送2本好书,参与好评送书~

  • 参与好评送书:随机抽取2位幸运读者,2位幸运读者各送一本实体书《Java核心技术》(卷一或卷二 自选一本)

  • 统计截止时间:2023/08/10 19:00:00

福利2

来虚竹哥送书的朋友圈点赞,点赞送书~
虚竹哥开放好友位 :传送门–》

  • 第8个,第88个好友点赞的,2位幸运读者各送一本实体书《Java核心技术》(卷一或卷二 自选一本)
  • 统计截止时间:2023/08/10 19:00:00

请中奖的读者统计截止时间过后7天内私信虚竹哥收货地址,过期奖励作废哈!

我是虚竹哥,我们明天见~

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

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

相关文章

makefile include 使用介绍

文章目录 前言一、include 关键字1. 语法介绍2. 处理方式示例: 二、- include 操作总结 前言 一、include 关键字 1. 语法介绍 在 Makefile 中,include 指令: 类似于 C 语言中的 include 。将其他文件的内容原封不动的搬入当前文件。 当 …

uniapp调查问卷评价功能

我本来用的是uniapp官方提供的组件uni-rate组件&#xff0c;但修改成我想要的样式有点麻烦&#xff0c;于是我就自己手写一个&#xff0c;比用组件简单一点&#xff1b; dom结构 <text class"formTit must">请您对本次活动进行评价</text> <view cl…

SQL注入实操三(SQLilabs Less41-65)

文章目录 一、sqli-labs靶场1.轮子模式总结2.Less-41 stacked Query Intiger type blinda.注入点判断b.轮子测试c.获取数据库名称d.堆叠注入e.堆叠注入外带注入获取表名f.堆叠注入外带注入获取列名g.堆叠注入外带注入获取表内数据 3.Less-42 Stacked Query error baseda.注入点…

idea使用protobuf

本文参考&#xff1a;https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf &#xff1f; Protocal Buffers(简称protobuf)是谷歌的一项技术&#xff0c;用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的&#xff0c;所以用…

【数理知识】求刚体旋转矩阵和平移矩阵,已知 N>=3 个点在前后时刻的坐标,且这 N>=3 点间距离始终不变代表一个刚体

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf的高级用法

Thymeleaf的高级用法 主要介绍Thymeleaf的内联、内置对象、内置变量等高级用法。 1.内联 虽然通过Thymeleaf中的标签属性已经几乎满足了开发中的所有需求&#xff0c;但是有些情况下需要在CSS或JS中访问后台返回的数据。所以Thymeleaf提供了th:inline"text/javascript/…

spring boot策略模式实用: 告警模块为例

spring boot策略模式实用: 告警模块 0 涉及知识点 策略模式, 模板方法, 代理, 多态, 反射 1 需求概括 场景: 每隔一段时间, 会获取设备运行数据, 如通过温湿度计获取到当前环境温湿度;需求: 对获取回来的进行分析, 超过配置的阈值需要产生对应的告警 2 方案设计 告警的类…

vuejs 设计与实现 - 双端diff算法

我们介绍了简单 Diff 算法的实现原理。简单 Diff 算法利用虚拟节点的 key 属性&#xff0c;尽可能地复用 DOM元素&#xff0c;并通过移动 DOM的方式来完成更新&#xff0c;从而减少不断地创建和销毁 DOM 元素带来的性能开销。但是&#xff0c;简单 Diff 算法仍然存在很多缺陷&a…

数据结构——双向链表

双向链表实质上是在单向链表的基础上加上了一个指针指向后面地址 单向链表请参考http://t.csdn.cn/3Gxk9 物理结构 首先我们看一下两种链表的物理结构 我们可以看到&#xff1a;双向在单向基础上加入了一个指向上一个地址的指针&#xff0c;如此操作我们便可以向数组一样操作…

【TypeScript】中关于 { 声明合并 } 的使用及注意事项

概念&#xff1a; 在TS中&#xff0c;如果定义了多个相同命名的函数&#xff0c;接口或者class 类&#xff0c;那么它们会自动合并成一个类型 函数的合并&#xff1a; 前面章节讲解的函数重载就是使用了定义多个函数的类型进行合并&#xff1a; function reverse(x: number):…

树状结构数据,筛选指定数据

问题描述&#xff1a; 应用场景和需求&#xff1a;对一个树状结构的数据&#xff0c;进行CRUD 时&#xff0c;想筛选出 树状结构数据中存在变动的部分。 操作步骤 准备需要的数据&#xff1a; 1.先拿到 你原来的树状结构数据 2.再筛选出 需要保留的数据集合id&#xff0c;也…

【《深入浅出计算机网络》学习笔记】第1章 概述

内容来自b站湖科大教书匠《深入浅出计算机网络》视频和《深入浅出计算机网络》书籍 目录 1.1 信息时代的计算机网络 1.1.1 计算机网络的各类应用 1.1.2 计算机网络带来的负面问题 1.2 因特网概述 1.2.1 网络、互联网与因特网的区别与关系 1.2.1.1 网络 1.2.1.2 互联网 …

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

Jenkins持续集成-快速上手

Jenkins持续集成-快速上手 注&#xff1a;Jenkins一般不单独使用&#xff0c;而是需要依赖代码仓库&#xff0c;构建工具等。 搭配组合&#xff1a;GitGitee&#xff08;GitHub、GitLab&#xff09;MavenJenkins 前置准备 常见安装方式&#xff1a; war包Docker容器实例&…

W5100S-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W5100S-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…

从Spring源码看创建对象的过程

从Spring源码看创建对象的过程 Spring对于程序员set注入的属性叫做属性的填充、对于set注入之后的处理&#xff08;包括BeanPostProcessor的处理、初始化方法的处理&#xff09;叫做初始化。 研读AbstractBeanFactory类中的doGetBean()方法 doGetBean()方法首先完成的工作是…

【Linux操作系统】makefile入门:一个规则-两个函数-三个变量

在Linux中&#xff0c;makefile是一种非常重要的工具&#xff0c;用于自动化构建和管理项目。它可以帮助开发人员轻松地编译和链接程序&#xff0c;同时还可以处理依赖关系和增量构建等问题。在makefile中&#xff0c;我们将重点介绍makefile中的一个规则&#xff0c;两个函数和…

湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟

一、链接 AB IV 二、题目 题目描述 小明喜欢做ab的算术&#xff0c;但是他经常忘记把末位对齐&#xff0c;再进行加&#xff0c;所以&#xff0c;经常会算错。 比如1213&#xff0c;他把12左移了1位&#xff0c;结果变成了133。 小明已经算了一些等式&#xff0c;请计算一下…

harbor搭建

回到目录 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务 通俗的讲&#xff0c;harbor是一个私人镜像存储服务器 1 下载安装 进入官网&#xff0c;下载一个离线安装包,harbor官网下载 这…

Vc - Qt - QToolButton

QToolButton 是 Qt 框架中的一个类&#xff0c;是 QPushButton 的子类。它可以显示一个可单击的按钮&#xff0c;并且可以与弹出菜单、图标和文本等进行关联。 QToolButton的一些常见特性和用法包括&#xff1a; 设置文本&#xff1a;使用 setText() 函数设置按钮上的文本。设置…