慢 SQL 分析及优化

news2024/9/23 17:20:03

目录

分析慢 SQL

SQL 优化

单表优化

多表优化


 

  • 慢 SQL:指 MySQL 中执行比较慢的 SQL
  • 排查慢 SQL 最常用的方法:通过慢查询日志来查找慢 SQL

MySQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阈值的语句,具体指运行时间超过 long_query_time(慢查询阈值) 值的 SQL,就会被记录到慢查询日志中,long_query_time 的默认值为 10s,意思是运行超过 10s 以上的语句就会被当做慢 SQL 记录到日志中。


分析慢 SQL

如果一条 sql 执行很慢的话,我们通常会使用 mysql 自动的执行计划 explain 来去查看这条 sql 的执行情况

关注 type 字段:

  • all — 扫描全表数据
  • index — 遍历索引
  • range — 索引范围查找
  • index_subquery — 在子查询中使用 ref
  • unique_subquery — 在子查询中使用 eq_ref
  • ref_or_null — 对 null 进行索引的优化的 ref
  • fulltext — 使用全文索引
  • ref — 使用非唯一索引查找数据
  • eq_ref — 在 join 查询中使用主键或唯一索引关联
  • const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。

如果存在全索引扫描(type = all) 则说明没有走索引,我们可以给查询的慢字段加上相应的索引就可以提交效率。

通过 key 和 key_len 检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否又失效的情况

通过 extra 建议判断是否出现回表的情况,如果出现了可以尝试添加索引或修改返回字段来修复

SQL 优化

MySQL 优化分为 单表优化 和 多表优化

单表优化

  • 建立并使用索引:索引是提高查询最有效的手段
  • 优化查询语句:避免使用 select * ,只查询需要的字段;使用小表驱动大表,比如当 B 表的数据小于 A 表时,先查 B 表,再查 A 表,查询语句:select * from A where id in (select id from B);如果是聚合查询,尽量使用 union all 代替 union,union 会多义词过滤,效率比较低;不使用 order by rand();
  • 优化表结构和数据类型:单表不要有太多字段,建议在 20 个字段以内,使用可以存下数据最小的数据类型,尽可能使用 not null 定义字段,因为 null 占用 4 字节空间。

多表优化

  • 表拆分:就是分表,让每张表的数据量变小,从而提高查询效率。表拆分又分为:垂直分隔和水平分隔。

        垂直拆分:是指数据表列的拆分,把一张列比较多的表拆分为多张表,比如,用户表中一些字段经常被访问,将这些字段放在一张表中,另外一些不常用的字段放在另一张表中,插入数据时,使用事务确保两张表的数据一致性。

        水平拆分:指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。通常情况下,我们使用取模的方式来进行表的拆分,比如,一张有 400W 的用户表 users,为提高其查询效率我们把其分成 4 张表 users1,users2,users3,users4,然后通过用户 ID 取模的方法,同时查询、更新、删除也是通过取模的方法来操作。

  • 读写分离:一般情况下对数据库而言都是“读多写少”,换言之,数据库的压力多数是因为大量的读取数据的操作造成的,我们可以采用数据库集群的方案,使用一个库作为主库,负责写入数据;其他库为从库,负责读取数据。这样可以缓解对数据库的访问压力。

优化方式有很多, 比如索引、查询优化(减少联表查询等)、减少锁竞争等因素,所以具体的慢 SQL 优化,需要根据实际的业务场景再做优化决策。

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

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

相关文章

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里,里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参,用指针传参怎么做呢? Main里函数的arr表示…

配置 Mantis 在 Windows 上的步骤

配置 Mantis Bug Tracker 在 Windows 上的步骤 Mantis Bug Tracker 是一款开源的缺陷跟踪系统,用于管理软件开发中的问题和缺陷。在 Windows 环境下配置 Mantis 可以帮助开发者更方便地进行项目管理。以下是一个详细的教程,包含了 EasyPHP Devserver 和…

多线程(进程池代码)

线程池介绍 那究竟什么是线程池呢? 线程池是一种线程使用模式. 线程过多会带来调度开销,进而影响缓存局部性和整体性能. 而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务. 这避免了在处理短时间任务时创建与销毁线程的代价. 线…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】新版试题及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2023年【A特种设备相关管理(锅炉压力容器压力管道)】新版试题及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题库,包含A特种设备相关管理(锅…

记录:Unity脚本的编写8.0

目录 需求分析设计GUI包含账号和密码输入栏,包括登录和注册按键添加背景音乐编写脚本控制音乐 退出按钮编写脚本 背景图片完整代码 一个小demo,登录和注册的实现(包括GUI和数据库操控) 需求分析 自行设计GUI,要求 1.包…

手机上使用的备忘录怎么分享给别人看?

手机备忘录大家应该都不陌生,通常大家使用手机备忘录会整理记录一些容易忘记的事情,多数手机备忘录被用来罗列重要的备忘事项,以防止自己遗忘,有时候大家也喜欢分享一些手机备忘录,但是并不是所有的手机备忘录都支持分…

Spring Boot 3.2.0 虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

Android Bitmap保存成至手机图片文件,Kotlin

Android Bitmap保存成至手机图片文件,Kotlin fun saveBitmap(name: String?, bm: Bitmap) {val savePath Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()if (!Files.exists(Paths.get(savePath))) {Log.d("保存文…

Linux以nohup方式运行jar包

1、在需要运行的jar包同级目录下建立启动脚本文件: 文件内容: #! /bin/bash #注意:必须有&让其后台执行,否则没有pid生成 jar包路径为绝对路径 nohup java -jar /usr/local/testDemo/jdkDemo-0.0.1-SNAPSHOT.jar >/us…

计算机基础知识60

MySQL分组 # 概念:分组是按照某个指定的条件将单个单个的个体分成一个个整体 # MySQL分组的关键字:group by # 分组一般配合聚合函数使用: sum max min avg count 基本的语法格式: group by 字段名 [having 条件表达式] # 单独使用 group by关…

机器学习与低代码:简化AI开发的未来

机器学习(Machine Learning)的应用如火如荼地扩展,其影响力和潜力在各行业得到了充分展现。然而,对于广大开发者和企业来说,机器学习模型的构建和部署并非易事,其中涉及的复杂过程和专业知识往往令人望而却…

苍穹外卖项目笔记(6)— Redis操作营业状态设置

1 在 Java 中操作 Redis 1.1 Redis 的 Java 客户端 Jedis(官方推荐,且命令语句同 redis 命令)Lettuce(底层基于 Netty 多线程框架实现,性能高效)Spring Data Redis(对 Jedis 和 Lettuce 进行了…

深入理解强化学习——马尔可夫决策过程:备份图(Backup Diagram)

分类目录:《深入理解强化学习》总目录 在本文中,我们将介绍备份(Backup)的概念。备份类似于自举之间的迭代关系,对于某一个状态,它的当前价值是与它的未来价值线性相关的。 我们将与下图类似的图称为备份图…

HassOS使用nmcli设置静态IPv4地址及网关、DNS

目录 显示hass在使用的默认连接显示此连接的所有配置编辑hass默认连接添加静态IP地址添加DNS和网关删除DNS查看IPv4属性保存配置并退出nmcli重载配置 首先控制台登陆Home Assistant OS Welcome to Home Assistant homeassistant login:使用root用户登录(无需密码&a…

Linux基础项目开发1:量产工具——显示系统(二)

前言: 前面我们已经对这个项目的基本框架有了一个初步的了解与认识,要实现显示管理器与输入管理器,有输入有输出基本就实现这个项目的大部分功能了,首先我们先来做显示系统,对于上层系统为了让程序更好扩展&#xff0c…

MySQL--日志

日志 错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息 当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认…

Mysql 高级日志binlog、undoLog、redoLog 详解

数据更新流程与日志记录: undoLog: binLog: redoLog:

计算机毕业设计php+bootstrap小区物业管理系统

意义:随着我国经济的发展和人们生活水平的提高,住宅小区已经成为人们居住的主流,人们生活质量提高的同时,对小区物业管理的要求也越来越高,诸如对小区的维修维护,甚至对各项投诉都要求小区管理者做得好&…

INFINI Gateway 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云、私有云、混合云、桌面云)推出的一项合作伙伴计划,旨在为构建持续发展、合作共赢的鲲鹏生态圈,通过整合华为的技术、品牌资源,与合作伙伴共享商机和利…

SpringBoot——模板引擎及原理

优质博文:IT-BLOG-CN 一、模板引擎的思想 模板是为了将显示与数据分离,模板技术多种多样,但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。 二、SpringBoot模板引擎 SpringBoot推荐的模板引擎是Thymeleaf语法简单&#xff0…