MySQl高级篇-查询优化篇

SQL性能分析

SQL性能下降原因:

  1. 查询语句写的烂
  2. 索引失效(数据变更)
  3. 关联查询太多join(设计缺陷或不得已的需求)
  4. 服务器调优及各个参数设置(缓冲、线程数等)

SQL调优过程:

  1. 观察,至少跑1天,看看生产的慢SQL情况。
  2. 开启慢查询日志,设置阙值,比如超过5秒钟的就是慢SQL,并将它抓取出来。
  3. explain + 慢SQL分析。
  4. show profile
  5. 运维经理 or DBA,进行SQL数据库服务器的参数调优。

SQL执行频率

MySQL客户端连接成功后,通过 show [session l global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

SHOW GLOBAL STATUS LIKE 'Com_______';

在这里插入图片描述

Mysql 查询优化

小表驱动大表

  • 当B表是小表时,用in优于exist
    select * from A where id in (select id from B)
    
  • 当A表是小表时,用exist优于in
    select * from A where id exists (select 1 from B where A.id = B.id)
    

EXISTS语法:

SELECT ...FROM table WHERE EXISTS (subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUEFALSE)来决定主查询的数据结果是否得以保留

Group by 优化

group by实质是先排序后进行分组,遵照索引建的最佳左前缀。当无法使用索引列,增大sort_buffer_size参数的设置,增大max_length_for_sort_data参数的设置可以提高排序和分组的效率。

where高于having,能写在where限定的条件就不要去having限定了

Show Profile进行sql分析(重中之重)

Show Profilemysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have profiling参数,能够看到当前MySQL是否支持profile操作:

SELECT @@have_profiling;

默认profiling是关闭的,可以通过set语句在session / global级别开启profiling:

SET profiling = 1;

随便执行一条sql

select * FROM t_blog;

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:

查看每一条SQL的耗时基本情况

show profiles;

在这里插入图片描述

查看指定query id的SQL语句各个阶段的耗时情况

show profile for query query_id;

在这里插入图片描述

查看指定query_id的SQL语句CPU的使用情况和lO相关开销

show profile cpu,block io for query query_id;

在这里插入图片描述
参数备注(写在代码中):show profile cpu,block io for query 3;(如此代码中的cpu,block)

  1. ALL:显示所有的开销信息。
  2. BLOCK IO:显示块lO相关开销。
  3. CONTEXT SWITCHES :上下文切换相关开销。
  4. CPU:显示CPU相关开销信息。
  5. IPC:显示发送和接收相关开销信息。
  6. MEMORY:显示内存相关开销信息。
  7. PAGE FAULTS:显示页面错误相关开销信息。
  8. SOURCE:显示和Source_functionSource_fileSource_line相关的开销信息。
  9. SWAPS:显示交换次数相关开销的信息。

日常开发需要注意的(Status列中的出现此四个问题严重)

  1. converting HEAP to MyISAM:查询结果太大,内存都不够用了往磁盘上搬了。
  2. Creating tmp table:创建临时表,拷贝数据到临时表,用完再删除
  3. Copying to tmp table on disk:把内存中临时表复制到磁盘,危险!
  4. locked:锁了

MySQL中,如何定位慢查询?

在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。

在这里插入图片描述

explain执行计划

EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

语法:

直接在select语句之前加上关键字 explain / desc

EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

在这里插入图片描述

字段解释

id:表的读取顺序

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

  1. id相同,执行顺序从表格由上至下
  2. id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

select_type: 数据读取操作的操作类型

查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

  • SIMPLE:简单的select查询,查询中不包含子查询或者UNION
  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为(最后加载的那个)
  • SUBQUERY :在SELECTWHERE列表中包含了子查询
  • DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询,把结果放在临时表里
  • UNION :若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中外层SELECT将被标记为:DERIVED
  • UNION RESULT :从UNION表获取结果的SELECT(两个select语句用UNION合并)

table:显示执行的表名

显示这一行的数据是关于哪张表的

type: sql的连接的类型

这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all

  1. system:查询系统中的表
  2. const:根据主键索引查询
  3. eq_ref:主键索引查询或唯一索引查询,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  4. ref:索引查询,非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
  5. range:范围查询,只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引
  6. index:索引树扫描,indexALL区别为index类型只遍历索引列。这通常比ALL快,因为索引文件通常比数据文件小(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
  7. all:全盘扫描

possible_key : 当前sql可能会使用到的索引

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段火若存在索引,则该索引将被列出,但不一定被查询实际使用(系统认为理论上会使用某些索引)

key 当前sql实际命中的索引

实际使用的索引。如果为NULL,则没有使用索引(要么没建,要么建了失效)

查询中若使用了覆盖索引,则该索引仅出现在key列表中

key_len 索引占用的大小

可通过该列计算查询中使用的索引的长度。

含义是:The length of the chosen key,所选键的长度。其单位是字节。

根据这个值,就可以判断索引使用情况。比如当key_len列显示为NULL时,key列也就会显示为NULL, 说明语句没有用到索引。比如在使用组合索引的时候,判断是否所有的索引字段是否都被用到。

如何根据key_len的值判断是否所有的索引字段都被用到,就要知道key_len的计算规则。

key_len的计算规则

  1. 可以为NULL的列的key长度比非NULL列的key长度大1。

    CREATE TABLE `a_test` (
      `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
      `server_id` int(4) NOT NULL DEFAULT <span style="color:#98c379">'0'</span>,
      `user_id` int(4) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_server_id` (`server_id`),
      KEY `idx_user_id` (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    如上所示,当使用idx_user_id索引时,key_len的值是5(int类型长度4+1),而使用idx_server_id索引时,key_len的值是4(仅为int类型长度4)。

  2. 如果索引列是字符型(char)字段,则索引列数据类型本身占用空间跟字符集有关。

    不同的字符集下,同一个字符存储到表中的时候,它所占用的空间大小是不同的。一个字符存储在表中,到底占用多少个字节byte,需要根据不同的字符集来分别计算。

    常用的几种字符集下,字符character和字节byte的换算关系如下:

    字符集1个字符占用字节数(Maxlen)
    GBK2
    UTF83
    UTF8mb44
    latin11

    在这里插入图片描述

  3. 如果索引列是变长的(比如varchar),则在索引列数据类型本身占用空间的基础上再加2。
    我们把上面的char类型替换成varchar。
    在这里插入图片描述

ref:表之间的引用

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

Extra 额外的优化建议

在这里插入图片描述

如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况

第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描

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

面试官:了解过索引吗?(什么是索引)

候选人:嗯,索引在项目中还是比较常见的,

  • 它是帮助MySQL高效获取数据的数据结构,
  • 主要是用来提高数据检索的效率,降低数据库的IO成本,
  • 同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗

面试官:索引的底层数据结构了解过嘛 ?

候选人:MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:

  • 第一阶数更多,路径更短
  • 第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
  • 第三是B+树便于扫库和区间查询,叶子节点是一个双向链表

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

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

相关文章

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源&#xff1a;2.安装Vue CLI&#xff1a;3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境&#xff0c;它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

硬件基础学习笔记

关于硬件基础的知识整理 三极管&#xff08;两个PN节组成的器件&#xff09;MOSFET&#xff0c;场效应管&#xff08;Field Effect Transistor&#xff09;1、增强型场效应管符号&#xff1a;2、开关特性&#xff1a; 对于一些硬件知识&#xff0c;容易忘记需要反复记忆&#x…

【杰理蓝牙开发】AC632 开发板烧录实例

AC632 开发板烧录实例 0. 个人简介 && 授权须知1. 硬件板卡介绍2. 代码烧录2.1 使用USB接口烧录2.2 使用串口烧录 3. 为什么要用烧录器供电&#xff1f; 0. 个人简介 && 授权须知 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c…

量化投资基础(一)之Black-Litterman模型

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1. 投资组合收益率与风险 假设市场有 N N N 个资产&#xff0c;其随机收益率分别为 R 1 , R 2 , … , R N R_1,R_2,\dots,R_N R1​,R2​,…,RN​ &#xff0c;对应…

【香橙派 AIpro测评:探索高效图片分类项目实战】

前言 最近入手了一块香橙派 AIpro开发板&#xff0c;在使用中被它的强大深深震撼&#xff0c;有感而发写下这篇文章。 本文旨在深入探讨OrangePi AIpro的各项性能&#xff0c;从硬件配置、软件兼容性到实际应用案例&#xff0c;全方位解析这款设备如何在开源社区中脱颖而出&am…

python中的类

类 类的创建 使用class关键字定义一个新的类 创建实例和使用 修改属性 类的访问权限&#xff08;只有属性和方法有访问权限&#xff09; 概念 种类 公有&#xff08;Public&#xff09;&#xff1a;公有成员可以被类的外部访问。这是默认的权限级别&#xff0c;如果不特别指定…

I2C子系统-内核视角

I2C驱动层级 内核自带的通用I2C驱动程序i2c-dev 编写一个设备驱动程序 控制器驱动程序I2C Adapter框架 GPIO模拟I2C&#xff0c;实现I2C_Adapter驱动 具体芯片下I2C_Adapter驱动 I2C驱动层级 一张图整理&#xff0c;可以看完后面的具体内容再回来看这张图&#xff1a; 接…

Docker的虚拟化安装、常用命令和使用案例

文章目录 一、Docker的虚拟机安装1、完成虚拟机的更新2、完成Docker安装3、配置镜像加速器 二、Docker常用命令三、Docker的容器创建四、理解虚拟机中的Docker容器 一、Docker的虚拟机安装 1、完成虚拟机的更新 详见我的文章。 2、完成Docker安装 yum list installed|grep …

第二周周日学习总结

题目总结 1. 给你一个仅由数字组成的字符串 s&#xff0c;在最多交换一次 相邻 且具有相同 奇偶性 的数字后&#xff0c;返回可以得到的 字典序最小的字符串 。 如果两个数字都是奇数或都是偶数&#xff0c;则它们具有相同的奇偶性。例如&#xff0c;5 和 9、2 和 4 奇偶性…

2024年7月9日~2024年7月15日周报

目录 一、前言 二、完成情况 2.1 特征图保存方法 2.1.1 定义网络模型 2.1.2 定义保存特征图的钩子函数 2.1.3 为模型层注册钩子 2.1.4 运行模型并检查特征图 2.2 实验情况 三、下周计划 一、前言 本周的7月11日~7月14日参加了机器培训的学习讨论会&#xff0c;对很多概…

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

记录些MySQL题集(1)

Innodb 是如何实现事务的&#xff1f; InnoDB是MySQL数据库的一个存储引擎&#xff0c;它支持事务处理。事务处理是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个或多个SQL语句组成&#xff0c;这些语句要么全部执行&#xff0c;要么全部不执行&#xff0c;是一个…

Poetry2Image:专为中文古诗词图像生成,忠于原诗意境和语义。

直接基于文本的图像生成通常会导致丢失图像中的关键元素。为了解决此问题&#xff0c;哈工大提出Poetry2Image&#xff0c;通过实施有针对性的图像校正解决这个问题&#xff0c;有效地捕捉这首诗所传达的语义和艺术精髓。 Poetry2Image流程分为如下几步&#xff1a; 搜索和翻译…

免费进销存软件哪个好用?首选象过河

在快节奏的商业环境中&#xff0c;进销存管理一直是不可忽视的重要环节&#xff0c;关乎着企业的运营成本控制和运营效率的高低。传统的纸质记录已难以满足企业发展需求&#xff0c;很多企业管理者为了节约成本&#xff0c;都想寻找一款免费进销存软件。那么&#xff0c;免费进…

(day18) leetcode 204.计数质数

描述 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3…

计算机系统复习——文件系统和目录

文件系统 存储管理&#xff1a; 文件系统负责将文件存储在存储设备&#xff08;如硬盘、固态硬盘&#xff09;中&#xff0c;并记录文件的位置和大小。 文件访问控制&#xff1a; 文件系统管理文件的访问权限&#xff0c;确保只有授权用户可以读取、写入或执行文件。 数据…

PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题&#xff1f;一、了解长事务阻塞的原因&…

Qt进阶版五子棋

五子棋是一种两人对弈的棋类游戏&#xff0c;目标是在横、竖、斜任意方向上连成五个子。在Qt中实现五子棋程序&#xff0c;你需要设计棋盘界面、处理下棋逻辑、判断胜负等。以下是实现一个基本五子棋程序的步骤&#xff1a; 创建项目和界面 使用Qt Creator创建一个新的Qt Widge…

人工智能大模型讲师培训老师叶梓介绍及多模态大模型原理与实践提纲

培训需要解决的问题 通过本次培训&#xff0c;拓展对多模态AI应用领域的视野&#xff0c;帮助团队聚焦AI赋能创新突破&#xff0c;提升对AI服务的技术认知与理解&#xff0c;更好地助力业务智能化业务建设。 培训时长 1天 培训老师介绍 叶梓&#xff0c;工学博士&#xff0…