MySQL的慢sql

  1. 什么是慢sql

    1. 每执行一次sql,数据库除了会返回执行结果以外,还会返回sql执行耗时,以mysql数据库为例,当我们开启了慢sql监控开关后,默认配置下,当sql的执行时间大于10s,会被记录到慢sql的日志文件中
    2. 这个值可以重新设置,生产环境慢sql一般设置为0.1-0.2s,当我们将其设置为0.2s时。当前数据库所有sql的执行时长超过0.2s的都会被视为慢sql
  2. 慢sql的危害

    1. 当出现慢查询时,DDL操作都会被阻塞,也就是说创建表,修改表,删除表,执行数据备份等操作都需要等待,这对实时备份重要数据的系统来说是不可容忍的
    2. 慢查询可能会占用mysql大量的内存,严重的时候会导致应用的进程因超时被kill,无法返回结果给到客户端
    3. 造成数据库幻读,不可重复读的概率更大,假设该慢sql是一个更新操作,但因执行时间过长未提交,而另一条sql也在更新数据并且已经提交,当用户再次查询的时候,看到的数据可能与实际结果不符
    4. 严重影响用户体验:sql的执行时间越长,页面加载数据耗时也就越长
  3. 如何定位慢sql

    1. 开启慢sql监控

      1. show variables like ‘slow_query_log%’; 查询是否开启慢sql监控

        1. show_query_log OFF 默认是关闭状态
        2. slow_query_log_file /var/lib/mysql/ecs-203056-slow.log 慢sql的日志存储文件
      2. set global slow_query_log = 1 ;

        1. 开启慢sql查询,执行成功后,客户端需要重新连接才能生效
        2. 如果想关闭慢sql监控,将其配置为0就可以了
        3. 当服务器重启之后,当前配置会失效
      3. 配置慢sql阈值

        1. 默认的慢sql的阈值是10s,
          1. show variable like 'long_query_time1; 查询慢sql阈值
          2. long_query_time 10 默认是10s
        2. set global long_query_time = 0.2;
          1. 将慢sql阈值配置为0.2秒’
          2. 然后退出客户端,重新连接服务器,就生效了
          3. 当服务器重启之后,当前配置会失效
      4. 永久开启慢sql监控

        1. 以上的操作,当服务器不重启会一直有效,但是当服务器一旦重启之后,配置就会失效,如果想要永久生效,可以通过修改全局配置文件my.cnf使之永久生效

        2. 打开my.cnf配置文件,添加如下配置变量

          1. [mysqld]
            slow_query_log = ON
            slow_query_log_file = /var/lib/mysql/ecs-203056-slow.log
            long_query_time = 1
            
          2. 重启mysql服务器

          3. systemctl restart mysqld
            
      5. 慢sql监控

        1. 慢SQL日志内容详解

          1. Time:表示客户端查询时间
          2. root[root]表示客户端查询用户和IP
          3. Query_time:表示查询耗时
          4. Lock_time:表示等待table lock的时间,注意innodb的行锁等待是不会反应在这里的
          5. Rows_sent:表示返回了多少行记录(结果集)
          6. Rows_examined:表示检查了多少条记录
        2. 除此之外,我们还可以借助mysqldumpslow命令工具,分析慢sql的数据情况,可以通过如下参数进行组合分析

          1. -s         表示按何种方式排序,支持的参数如下al: 平均锁定时间ar: 平均返回记录数at: 平均查询时间c: 访问次数l: 锁定时间r: 返回记录t: 查询时间
            -t NUM       返回前面多少条的数据
            -g PATTERN   后边搭配一个正则匹配模式,大小写不敏感
            
        3. 常见用法如下

          1. 查询返回记录集最多的10个sql

            1. mysqldumpslow -s r -t 10 /var/lib/mysql/ecs-203056-slow.log
              
          2. 查询访问次数最多的10个sql

            1. mysqldumpslow -s c -t 10 /var/lib/mysql/ecs-203056-slow.log
              
          3. 查询按照时间排序的前10条里面含有做链接的查询语句

            1. mysqldumpslow -s t -t 10 -g "LEFT JOIN" /var/lib/mysql/ecs-203056-slow.log
              
      6. 慢sql是怎么发生的

        1. 在这里插入图片描述

        2. 一条sql语句执行时,总结起来大概分为以下几个步骤

          1. 若查询缓存打开则会优先查询缓存,若命中则直接返回结果给客户端
          2. 若缓存未命中,此时mysql需要搞清楚这条语句需要做什么,则通过分析器进行词法分析,语法分析
          3. 搞清楚要做什么之后,mysql会通过优化器对sql进行优化,生成一个最优的执行计划
          4. 最后通过执行器与存储引擎提供的接口进行交互,将结果返回给客户端
        3. 在mysql执行过程中,优化器可能会对我们即将要执行的sql进行改造,改造思路如下

          1. 根据搜索条件,找出sql中所有可能使用的索引
          2. 然后计算全表扫描的成本开销
          3. 接着计算使用不同索引执行查询的成本开销
          4. 最后会对比各种执行方案的成本开销,找出开销值最小的那一个
        4. 影响成本开销值的计算,主要是IO成本和CPU成本这两个指标

        5. 从IO视角看

          1. 当表的数据量越大,需要的IO次数也就越多
          2. 从磁盘读取数据比缓存读取数据,IO消耗的时间更多
          3. 全表扫描比通过索引快速查找,IO消耗的时间和次数更多
        6. 从CPU视角看

          1. 当sql中有排序,子查询等复杂的操作时,CPU需要先把数据存到临时表中,在对数据进行加工,需要的CPU资源更多
          2. 全表扫描相比于通过索引快速查找,需要的CPU资源也更多
        7. 在没有开启缓存的情况下,当表的数据量越大,如果sql又没有走索引,很容易发生查询慢的问题

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

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

相关文章

集中管理和分析日志:使用 ELK 套件构建强大的日志管理平台

集中管理和分析日志:使用 ELK 套件构建强大的日志管理平台 日志是监控和调试应用程序和系统的重要工具。集中管理和分析日志可以帮助你快速定位问题、了解系统运行状况和性能,并提高你的日志管理效率。ELK 是一个流行的日志管理解决方案,由 …

优选算法之技巧(一):双指针一:移位0与复写0

引用:我们之前学过快排,首先用三元取中,找(key),然后就用到了双指针的方法来进行交换排序,那我们今天要讲的双指针其实大同小异,无非在数组中就变成了下标。 题一: 给定一个数组 nums&#xf…

LDR6020-VR串流线:开启虚拟现实新纪元的钥匙

随着科技的飞速发展,虚拟现实(VR)技术已经从科幻概念逐渐走进我们的生活,成为娱乐、教育、医疗等多个领域的热门话题。而VR串流线,作为这一技术的重要组成部分,正逐步成为连接用户与高质量VR体验的关键桥梁…

pip的常用命令和常见问题的解决

常用命令 安装包:pip install package_name 例子:pip install requests 指定版本安装包:pip install package_nameversion_number 例子:pip install numpy1.19.4 升级包:pip install --upgrade package_name 例子&am…

移动硬盘坏道深度解析与应对全攻略

一、现象解读:移动硬盘坏道的直观展示 在数字化信息爆炸的今天,移动硬盘作为便捷的数据存储与传输工具,其重要性不言而喻。然而,随着使用时间的推移,不少用户遭遇了移动硬盘出现“坏道”的困扰。坏道,作为…

Python中如何使用列表或其他数据结构实现栈和队列

在Python中,可以使用列表(List)数据结构来方便地实现栈(Stack)和队列(Queue)这两种重要的数据结构。栈和队列都是基于先进后出(FILO, First In Last Out)和先进先出&…

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架,它提供了许多内置的功能,包括:支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下: …

SQL跨数据库服务器查询和跨表批量插入的操作

MSSQL实现跨服务器查询数据库 EXEC sp_addlinkedserver server192.168.1.10, --链接服务器别名 srvproduct, providerSQLOLEDB, datasrc192.168.1.10 --要访问的的数据库所在的服务器的ip GO EXEC sp_addlinkedsrvlogin 192.168.1.10, --链接服务器别名…

scp命令快速上手用法

作用 scp命令可以实现linux和linux,linux和windows之间文件互传 操作 实验准备 windows系统 ip:192.168.172.1 linux系统A ip:192.168.172.181 linux系统B ip:192.168.172.181 实验1:linux系统A推送文件到linxu…

elasticsearch用curl查询

curl:-X :指定http的请求方式,有HEAD、GET、POST、PUT、DELETE-d :指定要传输的数据-H :指定http的请求头信息 curl -XPUT http://ip:port/索引名?pretty-- 创建索引 curl -XGET http://ip:port/_cat/indices?v --查看当前es的所有索引信息 curl -XGET http://ip:…

基于springboot+vue+uniapp的贵工程寝室快修小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

哈喽GPT-4o,程序员如何通过GPT-4o提高工作效率

目录 一、编写代码Prompt:请用Java语言编写一个二分查找的样例 二、修正代码错误、代码优化Prompt:我们上传一张华为OD算法题的题目描述,再给它我的Java解题代码,问问它有什么问题? 三、解读代码功能、代码翻译Prompt&…

在Windows环境下安装Python 3.11的步骤

在Windows环境下安装Python 3.11的步骤相对直接。下面是详细的安装教程: 第一步:下载Python 3.11安装程序 访问Python官方网站的下载页面:https://www.python.org/downloads/在页面中找到适用于Windows的Python 3.11版本,点击下…

Java中的匿名类

匿名类简介 匿名类(Anonymous Classes)是在 Java 中定义的一种没有名字的内部类。它们通常用来简化代码编写,尤其是在需要创建简短的类实现接口或继承类的场景中。匿名类可以在方法、构造方法、字段初始化时使用。 匿名类的特性 没有类名&a…

【面试题】MySQL(第一篇)

1. MySQL是什么? MySQL是一种开源的关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)进行数据管理。MySQL具有高性能、可靠性、可扩展性和兼容性等特点,广泛应用于Web应用开发中。 2. …

数据分析入门指南Excel篇:各类Excel函数概览与详解(二)

在当今数字化时代,数据已成为推动业务决策和创新的关键因素。而表格结构数据,作为最常见的数据存储形式之一,广泛应用于财务、物流、电商等多个领域。本文将基于提供的材料文本,深入探讨表格数据的处理与分析,特别是通…

华为 eNSP 路由器 实现双wan出口 访问外网nat 策略路由配置

1 实验拓扑 2 路由器配置 #R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn [Huawei]sysname R1 [R1]int GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]qu [R1…

基于STM32设计的智能台灯(HC05蓝牙控制)179

基于STM32设计的智能台灯(HC05蓝牙控制)(179) 文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发…

详解Linux的shell脚本基础指令

一、shell简介 是Linux系统的用户界面&#xff0c;它提供用户与内核的一种交互方式。它接收用户输入的命令&#xff0c;并把它送入内核去执行&#xff0c;是一个命令解释器。 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是 特定格式的指令&#xff0c;系统可以…

如何选择快手矩阵源码:关键因素解析

在短视频行业迅速发展的今天&#xff0c;快手平台已成为众多内容创作者和企业的重要阵地。为了有效管理和运营多个快手账号&#xff0c;快手矩阵源码成为了一个关键工具。然而&#xff0c;市场上的快手矩阵源码种类繁多&#xff0c;选择一个合适的源码并非易事。本文将探讨选择…