MySQL 优化思路篇

MySQL 优化思路篇

  • 1、MySQL 查询的优化步骤
  • 2、查询系统性能参数
  • 3、慢查询日志定位问题
    • 3.1、开启慢查询日志参数
    • 3.2、查看慢查询数目
    • 3.3、慢查询日志的分析工具 mysqldumpslow
    • 3.4、关闭慢查询日志
    • 3.5、慢查询日志的删除与重建
  • 4、SHOW PROFILE :查看SQL执行成本

1、MySQL 查询的优化步骤

 

       数据库调优流程,主要分为两部分**观察(Show status)**和 行动(Action),分别用字母 S 和 A 表示,如下图:
在这里插入图片描述

  • 周期性的波动,可能是双十一,促销活动等,可以通过加缓存或更改缓存失效策略解决。

  • 开启慢查询,并设置long_query_time参数定义【慢】的阈值,帮助我们定位执行慢的SQL语句,收集慢查询语句,再通过分析工具对慢查询日志进行分析。

  • 对慢SQL使用 EXPLAIN 分析其执行计划,或者使用 SHOW PROFILE 查看慢SQL每一步骤的时间成本,以确认慢SQL是执行时间长还是等待时间长

    • 等待时间长,可以调优服务器参数,比如适当增加数据库的缓冲池。
    • 执行时间长,就考虑索引设计问题关联表数量过多数据库表结构设计问题等。
  • 以上均不能解决,再考虑是否数据库自身的 SQL 查询性能达到瓶颈。

    • 达到瓶颈,就考虑增加服务器(采用读写分离架构),或进行分库分表,比如垂直分库、垂直分表、水平分表等.
    • 如未达到瓶颈,则建议再重新检查以上各项。

在这里插入图片描述

2、查询系统性能参数

 

MySQL可使用 SHOW STATUS 语句查询 MySQL 数据库的性能参数执行频率等.

-- 执行语句
SHOW [GLOBAL | SESSION] STATUS LIKE '参数';
-- 查询 MySQL 服务器的连接次数,示例:
SHOW STATUS LIKE 'Connections';
-- 查询 MySQL 服务器的慢查询次数,示例:
SHOW STATUS LIKE 'Slow_queries';
参数说明
Connections连接MySQL服务器的次数。
UptimeMySQL 服务器的上线时间。
Slow_queries慢查询的次数。
Innodb_rows_readselect 查询返回的行数。
Innodb_rows_inserted执行 INSERT 操作插入的行数。
Innodb_rows_updated执行 UPDATE 操作更新的行数。
Innodb_rows_deleted执行 DELETE 操作删除的行数。
Com_select查询操作的次数。
Com_update更新操作的次数。
Com_insert插入操作的次数,批量插入只累加算一次。
Com_delete删除操作的次数。
last_query_cost统计查询成本,结果为查询所需要读取的页数量

3、慢查询日志定位问题

 
       MySQL 的慢查询日志,用来记录在MySQL中 响应时间超过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL,会被记录到慢查询日志中。long_query_time默认值为 10,指运行 10秒以上(不含10秒)的语句被认定为慢SQL.

       MySQL 默认没有开启慢查询日志,有需求可手动开启。由于开启慢查询日志,会或多或少带来一定的性能影响,如果不是调优需求的话,一般不建议启动该参数。慢查询日志支持将日志记录写入文件。

 

3.1、开启慢查询日志参数

 

-- 查询是否开启了慢查询日志,ON 表示开启,OFF 表示未开启,默认为 OFF.
-- 查询结果中 slow_query_log_file 表示慢查询日志所在文件地址
SHOW VARIABLES LIKE '%slow_query_log%';
-- 查询慢查询 阈值,查询结果单位 为 秒,默认为 10秒。
SHOW VARIABLES LIKE '%long_query_time%';
-- 设置 慢查询阈值为1s。
-- 注意:使用该方式对当前session的long_query_time是失效的,对新连接的客户端有效。
SET GLOBAL long_query_time = 1;

在这里插入图片描述

可以通过修改配置文件 my.cnf 或 my.ini 的方式,永久设置。

[mysqld]
slow_query_log=ON # 开启慢查询日志
slow_query_log_file=/var/lib/mysql/my_slow.log # 设置慢查询日志的目录和文件名信息
long_query_time=3  # 设置慢查询阈值为 3 秒
log_output=FILE

 

3.2、查看慢查询数目

 

-- 查询当前系统中有多少条慢查询记录
SHOW GLOBAL STATUS LIKE '%slow_queries%';
-- 慢查询的认定与两个因素有关,除慢查询阈值外,还有一个 扫描过的最少记录数(min_examined_row_limit )
-- 如果查询扫描的记录数,超过该变量指,且超过慢查询阈值,即认定为慢SQL.
-- min_examined_row_limit 默认值为 0
-- 可通过 修改配置文件 my.cnf 或 my.ini 修改 min_examined_row_limit值,
-- 也可通过 set 语句修改  min_examined_row_limit

 

3.3、慢查询日志的分析工具 mysqldumpslow

 

-- mysqldumpslow 工具由 MySQL提供。
-- 可以查看 mysqldumpslow 帮助说明
mysqldumpslow -- help
-- 使用 mysqldumpslow 查看 慢日志文件示例
-- 显示5条,不显示查询参数
-- mysqldumpslow -s t  -t 5 [慢日志文件全路径地址] 
mysqldumpslow -s t  -t 5 /var/lib/mysql/atguigu05-slow.log
-- 显示5条,显示查询参数
-- mysqldumpslow -a -s t  -t 5 [慢日志文件全路径地址] 
mysqldumpslow -a -s t  -t 5 /var/lib/mysql/atguigu05-slow.log

在这里插入图片描述
 

3.4、关闭慢查询日志

 

  • 永久性方式

    -- 修改配置文件 my.cnf 或 my.ini ,把[mysqld]组下的 slow_query_log 值设为 OFF. 
    -- 修改配置文件后,保存,再重启MySQL服务,即可生效。
    [mysqld]
    slow_query_log=OFF
    -- 或者注释掉 slow_query_log,保存,再重启MySQL服务,即可生效。
    [mysqld]
    # slow_query_log=OFF
    
  • 临时性方式

    -- 使用SET 语句设置
    SET GLOBAL slow_query_log=OFF;
    

 

3.5、慢查询日志的删除与重建

 

-- 找到慢查询日志地址
SHOW VARIABLES LIKE '%slow_query_log_file%';
-- 使用 rm -rf [慢查询日志文件全路径地址] 删除
-- mysqladmin flush-logs slow 重新生成慢查询日志文件
mysqladmin -uroot -p flush-logs slow
-- 慢查询日志的删除重建,都是使用 mysqladmin flush-logs slow 来执行的,
-- 一旦执行该命令,慢查询日志都只存在新的日志文件中,如果需要旧的查询日志,就需要事先备份。

4、SHOW PROFILE :查看SQL执行成本

 

       show profile 是MySQL 提供用来分析当前会话中的SQL做了什么、执行的资源消耗情况的工具,用于SQL调优优化。默认情况下处于关闭状态,并保存最近15次的运行结果。

-- 查看 show profile 启动状态,ON 开启,OFF 关闭。
SHOW VARIABLES LIKE 'profiling';
-- 在会话级别开启 
SET profiling = 'ON';
-- 查询最近 15次查询的 query_id
SHOW profiles;
-- 查看最近一次查询的开销
SHOW profile;
-- 查询 query_id 为2 的执行成本
SHOW profile for query 2;
-- 添加 cpu、memory 列参数
SHOW  profile cpu,memory;

在这里插入图片描述

status列 结果说明:

  1. starting:查询开始执行的时间点。
  2. checking permissions:检查执行查询所需的权限的时间点。
  3. Opening tables:打开查询中涉及的表的时间点。
  4. init:初始化查询执行的时间点。
  5. System lock:获取系统锁的时间点。
  6. optimizing:查询优化器优化查询的时间点。
  7. statistics:收集统计信息的时间点。
  8. preparing:准备执行查询的时间点。
  9. executing:执行查询的时间点。
  10. Sending data:发送查询结果的时间点。
  11. end:查询执行结束的时间点。
  12. query end:查询结束的时间点,包括发送结果到客户端的时间。
  13. closing tables:关闭查询中涉及的表的时间点。
  14. freeing items:释放查询执行过程中使用的资源的时间点。
  15. cleaning up:清理查询执行过程中的临时数据和状态的时间点。

 
show profile 常用查询参数:

参数说明
ALL显示所有的开销信息。
BLOCK IO显示块 IO 开销。
CONTEXT SWITCHES上下文切换开销。
CPU显示 CPU 开销信息。
IPC显示发送和接收开销。
MEMORY显示内存开销信息。
PAGE FAULTS显示页面错误开销信息。
SOURCE显示和 source_function、source_file、source_line 相关的开销信息。
SWAPS显示交换次数开销信息。

 
日常开发需注意的结论:

  • ① converting HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。
  • ② Creating tmp table:创建临时表。先拷贝数据到临时表,用完再删除临时表。
  • Copying to tmp table on disk:把内存中临时表复制到磁盘上,警惕!
  • locked.

如果再 show profile 诊断结果中出现了以上四种结果中的一条,则SQL语句需要优化。

SHOW PROFILE 命令相关信息,也可以 通过查 information_schema 中的 profiling 数据表中查到。

 
EXPLAIN 相关的内容,请看系列文章四: 《MySQL 的索引分类和设计原则》
 
 
系列文章:

一: 《搞懂 MySql 的架构和执行流程》

二: 《从InnoDB索引的数据结构,去理解索引》

三: 《从 Hash索引、二叉树、B-Tree 与 B+Tree 对比看索引结构选择》

四: 《MySQL 的索引分类和设计原则》

五: 《MySQL 优化思路篇》
 
 
 
 
 
.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React基础知识02

一、通过属性来传值(props) react中可以使用属性(props)可以传递给子组件,子组件可以使用这些属性值来控制其行为和呈现输出。 例子: // 1.1 父组件 import React, { useState } from react // 1.2引入子…

测试老鸟,Python接口自动化测试框架搭建-全过程,看这篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、接口测试自动化…

Django实战项目-学习任务系统-查询列表分页显示

接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。 本…

Centos虚拟机安装配置与MobaXterm工具及Linux常用命令

目录 一、Centos操作系统 1.1 Centos介绍 1.2 Centos虚拟机安装 1.3 配置centos的镜像 1.4 虚拟机开机初始设置 1.4.1 查看网络配置 1.4.2 编辑网络配置 二、MobaXterm工具 2.1 MobaXterm介绍 2.2 MobaXterm安装 2.3 切换国内源 三、Linux常用命令和模式 3.1 查看网络配置 …

前端工程师的摸鱼日常(20)

今年一整年状态都不怎么好,所以别说摸鱼文了,其他技术文章都没写几篇,发生的事情有点多,无暇顾及这些,当然最主要的一个原因还是因为懒! 有很多时候我都觉得人的大脑是单线程的,在处理一件事情…

Vue 事件绑定 和 修饰符

目录 一、事件绑定 1.简介 : 2.实例 : 二、修饰符 1.简介 : 2.实例 : 3.扩展 : 一、事件绑定 1.简介 : (1) 在Vue中,通过"v-on:事件名"可以绑定事件,eg : v-on:click表示绑定点击事件。 (2) 触发事件时调用的方法,定义在Vu…

HBase理论与实践-基操与实践

基操 启动&#xff1a; ./bin/start-hbase.sh 连接 ./bin/hbase shell help命令 输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细&#xff0c;要注意的是表名&#xff0c;行和列需要加引号。 建表&#xff0c;查看表&#xff0c;插入数据&#…

Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

目录 1、文章介绍 2、具体思路和写法 &#xff08;1&#xff09;AB包的打包 &#xff08;2&#xff09;AB包的加载 &#xff08;3&#xff09;AB包卸载 3、结语 1、文章介绍 本篇博客主要起记录和学习作用&#xff0c;简单的介绍一下AB包批量的打包和加载AB包的方式&…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

使用这些优秀的 iPad App 提升您的技术水平

还记得当年 iPad 隆重登场&#xff0c;每个人都对其改变游戏规则的潜力感到震惊吗&#xff1f;嗯&#xff0c;你猜怎么着&#xff1f;iPad 应用程序世界已经发展&#xff0c;我们为您精心挑选了最好的应用程序&#xff08;由 AVNation 提供&#xff09;。 1、Crestron Electro…

求解一个整数中含多少个1

1.问题描述&#xff1a;给定一个整数&#xff0c;统计其对应的二进制中含有1的个数。比如8(0000 1000),对应的二进制数中&#xff0c;只含有一个1. 2.设计思路&#xff1a;对x取余&#xff1a;zx%2。如果z&#xff01;0&#xff0c;说明x的末尾不是为1.对于一个二进制x4x3x2x1…

HHDBCS扩展数据库类型

为应对市面上的数据库种类繁多的问题&#xff0c;HHDBCS设置了扩展数据库功能。 在登陆界面点击“工具”&#xff0c;选择“扩展数据库类型”&#xff1b; 注&#xff1a;HHDBCS支持已kingbase&#xff0c;本文仅用来举例。 填入名称、所需数据库的信息&#xff0c;上传驱动…

【广州华锐互动】军用飞机VR实战训练系统

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统&#xff0c;正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术&#xff0c;为飞行员提供真实且逼真的模拟飞行环境&#xff0c;使之能够在…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式&#xff0c;具体来说&#xff0c;就是在不违背封装原则的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容&#xff1a;一部分是…

JS加密/解密之jsjiami在线js加密的效率问题

故事背景 ​ 经常有客户反馈&#xff0c;v7加密的效率比v6低&#xff0c;但是安全性更好。这里我给大家科普一下关于jsjiami的优化诀窍。 示例源代码 // 伪代码 while (1) {var name ‘张三’ }优化后 var _name 张三; while (1) {var name _name }优化原理 相信很多朋…

uni-app微信小程序打开第三方地图

需求 小程序中有个按钮点击以后会调用手机中第三方地图进行导航。参数 位置信息 经度 与纬度。 实现方法 uni.openLocation({latitude: Number(地址纬度),longitude: Number(地址经度),name: 地址名称,address: 地址详情,success: function (res) {console.log(打开系统位置地…

利用日期创建文件-多用于数据库的备份

功能&#xff1a;根据日期变化实现文件的创建 1&#xff09;知识点&#xff0c;date命令的用法 --date"n day ago" %Y%m%d #n天前&#xff0c;当天则可以去掉--date参数 2&#xff09;文件名的拼接 ${filename}${date} 3查看结果文件 后期学循环语句可以改一下…

计算机视觉基础——基于yolov5-face算法的车牌检测

文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…

Python画图之HelloKitty

Python-turtle画出HelloKitty&#xff08;有趣小游戏&#xff09; 一、效果图二、安装库1.常用镜像源2.库下载 三、Python代码 一、效果图 二、安装库 1.常用镜像源 1. 豆瓣http://pypi.douban.com/simple/ 2. 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple…
最新文章