慢SQL调优第一弹——更新中

news2024/12/24 20:28:50

基础知识

Explain性能分析

通过explain我们可以获得以下信息:
表的读取顺序
数据读取操作的操作类型
哪些索引可以被使用
哪些索引真正被使用
表的直接引用
每张表的有多少行被优化器查询了
在这里插入图片描述

1)ID字段说明

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下

id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

2)select_type和table字段说明

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

simple : 简单的select查询,查询中不包含子查询或者UNION
EXPLAIN SELECT * FROM L1 where id = 1;
在这里插入图片描述

primary : 查询中若包含任何复杂的子部分,最外层查询被标记
subquery : 在select或where列表中包含了子查询
EXPLAIN SELECT * FROM L2 WHERE id = (
SELECT id FROM L1 WHERE id = (SELECT L3.id FROM L3 WHERE L3.title =
‘ruyuan08’));
在这里插入图片描述
union : union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个
以后的表select_type都是union
derived : 在from列表中包含的子查询被标记为derived(派生表),MySQL会递归执行这些子
查询,把结果放到临时表中
union result : UNION 的结果
EXPLAIN SELECT * FROM (select * from L3 union select * from L4)a;
在这里插入图片描述

3) type字段说明

type字段显示的是连接类型 ( join type表示的是用什么样的方式来获取数据),它描述了找到所需数据所使用的扫描方式, 是较为重要的一个指标。
完整的连接类型比较多,简化之后,我们可以只关注一下几种,按照从最佳类型到最坏类型进行排序:
system > const > eq_ref > ref > range > index > ALL
一般来说,需要保证查询至少达到 range级别,最好能到ref,否则就要就行SQL的优化调整

下面介绍type字段不同值表示的含义:
system: 表中就仅有一行数据的时候. 这是const连接类型的一个特例,很少出现。

const: const表示命中主键索引(primary key) 或者唯一索引(unique),表示通过索引一次就找到数据记录.
因为只匹配一条记录,所以被连接的部分是一个常量. (如果将主键放在 where条件中, MySQL就能将该查询转换为一个常量) 这种类型非常快.
例如以下查询:
explain select * from L1 where id = 3;
– 为L1表的title字段添加唯一索引
alter table L1 add unique(title);
explain select * from L1 where title = ‘ruyuan001’;
在这里插入图片描述

eq_ref : 对于前一个表中的每个一行,后表只有一行被扫描。除了system和const类型之外,这是最好的连接类型。只有当联接使用索引的部分都是主键或惟一非空索引时,才会出现这种类型。
例如以下查询:
EXPLAIN SELECT L1.id,L1.title FROM L1 left join L2 on L1.id = L2.id;
在这里插入图片描述

ref : 非唯一性索引扫描(使用了普通索引), 对于前表的每一行(row),后表可能有多于一行的数据被扫描,它返回所有匹配某个单独值的行.
例如以下查询:
– 为L1表的title字段添加普通索引
alter table L1 add index idx_title (title) ;
EXPLAIN SELECT * FROM L1 inner join L2 on L1.title = L2.title;
在这里插入图片描述

range : 索引上的范围查询,检索给定范围的行,between,in函数,> 都是典型的范围(range)查询,
例如以下查询:
EXPLAIN SELECT * FROM L1 WHERE L1.id between 1 and 10;
注: 当in函数中的数据很大时,可能会导致效率下降,最终不走索引
在这里插入图片描述

index : 出现index 是 SQL 使用了索引, 但是没有通过索引进行过滤,需要扫描索引上的全部数据 (查找所有索引树,比ALL快一些,因为索引文件要比数据文件小 ), 一般是使用了索引进行排序分组.
EXPLAIN SELECT * FROM L2 group by id order by id;
– 该count查询需要通过扫描索引上的全部数据来计数
EXPLAIN SELECT count(*) FROM L2;
在这里插入图片描述

ALL : 没有使用到任何索引, 连接查询时对于前表的每一行,后表都要被全表扫描。
EXPLAIN SELECT * FROM L3 inner join L4 on L3.title = L4.title ;
在这里插入图片描述

总结各类type类型的特点:
type类型 | 解释
system:不进行磁盘IO,查询系统表,仅仅返回一条数据
const:查找主键索引,最多返回1条或0条数据. 属于精确查找
eq_re:查找唯一性索引,返回数据最多一条, 属于精确查找
ref:查找非唯一性索引,返回匹配某一条件的多条数据,属于精确查找,数据返回可能是
多条.
range:查找某个索引的部分索引,只检索给定范围的行,属于范围查找. 比如: > 、 < 、in、between
index 查找所有索引树,比ALL快一些,因为索引文件要比数据文件小.
ALL 不使用任何索引,直接进行全表扫描

4)possible_keys 与 key说明

possible_keys
显示可能应用到这张表上的索引,一个或者多个. 查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用.
key
实际使用的索引,若为null,则没有使用到索引。(两种可能,1.没建立索引, 2.建立索引,但索引失效)。查询中若使用了覆盖索引,则该索引仅出现在key列表中。

5)key_len字段说明

表示索引中使用的字节数, 可以通过该列计算查询中使用索引的长度.
key_len 字段能够帮你检查是否充分利用了索引 ken_len 越长,说明索引使用的越充分

6)ref 字段说明

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值
L1.id=‘1’; 1是常量 , ref = const
EXPLAIN SELECT * FROM L1 WHERE L1.id=1;
在这里插入图片描述

7)rows 字段说明

表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
L3中的title没有添加索引, 所以L3中有3条记录,就需要读取3条记录进行查找.
EXPLAIN SELECT * FROM L3,L4 WHERE L3.id = L4.id AND L3.title LIKE ‘ruyuan007’;
在这里插入图片描述

8)filtered 字段说明

它指返回结果的行占需要读到的行(rows列的值)的百分比

9)extra 字段说明

Extra 是 EXPLAIN 输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息.

Using filesort
执行结果Extra为 Using filesort ,这说明,得到所需结果集,需要对所有记录进行文件排序。
这类SQL语句性能极差,需要进行优化。
典型的,在一个没有建立索引的列上进行了order by,就会触发filesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。
EXPLAIN SELECT * FROM users ORDER BY age;
在这里插入图片描述

Using temporary
表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
EXPLAIN SELECT COUNT(*),uname FROM users GROUP BY uname;
在这里插入图片描述

Using where
意味着全表扫描或者在查找使用索引的情况下,但是还有查询条件不在索引字段当中.
需要注意的是:

  1. 返回所有记录的SQL,不使用where条件过滤数据,大概率不符合预期,对于这类SQL往往需
    要进行优化;
  2. 使用了where条件的SQL,并不代表不需要优化,往往需要配合explain结果中的type(连接
    类型)来综合判断。例如本例查询的 age 未设置索引,所以返回的type为ALL,仍有优化空
    间,可以建立索引优化查询。
    EXPLAIN SELECT * FROM users WHERE age=10;
    在这里插入图片描述

Using index
表示直接访问索引就能够获取到所需要的数据(覆盖索引) , 不需要通过索引回表.
– 为uname创建索引
alter table users add index idx_uname(uname);
EXPLAIN SELECT uid,uname FROM users WHERE uname=‘lisa’;
在这里插入图片描述

Using join buffer
使用了连接缓存, 会显示join连接查询时,MySQL选择的查询算法 .
EXPLAIN SELECT * FROM users u1 LEFT JOIN (SELECT * FROM users WHERE age = 1) u2 ON u1.age = u2.age;
在这里插入图片描述
Using join buffer (Block Nested Loop) 说明,需要进行嵌套循环计算, 这里每个表都有五
条记录,内外表查询的type都为ALL。
问题在于 两个关联表的关联使用了字段 age,并且age字段未建立索引,就会出现这种情况。

Extra主要指标的含义(有时会同时出现)
using index :使用覆盖索引的时候就会出现
using where :在查找使用索引的情况下,需要回表去查询所需的数据
using index condition :查找使用了索引,但是需要回表查询数据
using index & using where :查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

优化原则详解

1)最佳左前缀法则

最佳左前缀法则: 如果创建的是联合索引,就要遵循该法则. 使用索引时,where后面的条件需要从索引
的最左前列开始使用,并且不能跳过索引中的列使用。

最佳左前缀底层原理
MySQL创建联合索引的规则是: 首先会对联合索引最左边的字段进行排序, 在第一个字段的基础之上 再对第二个字段进行排序.
所以: 最佳左前缀原则其实是和B+树的结构有关系, 最左字段肯定是有序的, 第二个字段则是无序的(联合索引的排序方式是: 先按照第一个字段进行排序,如果第一个字段相等再根据第二个字段排序).

2) 不要在索引列上做任何计算

不要在索引列上做任何操作,比如计算、使用函数、自动或手动进行类型转换,会导致索引失效,从而使查询转向全表扫描。

3) 范围之后全失效

在编写查询语句时, where条件中如果有范围条件, 并且范围条件之后还有其他过滤条件, 那么范围条件之后的列就都将会索引失效.

4) 避免使用 is null 、 is not null、!= 、or

使用 is null 会使索引失效

使用 is not null 会使索引失效

使用 != 和 or 会使索引失效

5) like以%开头会使索引失效

like查询为范围查询,%出现在左边,则索引失效。%出现在右边索引未失效.

解决%出现在左边索引失效的方法
使用覆盖索引
通过使用覆盖索引 type = index ,并且 extra = Using index ,从全表扫描
变成了全索引扫描.

like 失效的原理

  1. %号在右: 由于B+树的索引顺序,是按照首字母的大小进行排序,%号在右的匹配又是匹配首
    字母。所以可以在B+树上进行有序的查找,查找首字母符合要求的数据。所以有些时候可以
    用到索引.
  2. %号在左: 是匹配字符串尾部的数据,我们上面说了排序规则,尾部的字母是没有顺序的,
    所以不能按照索引顺序查询,就用不到索引.
  3. 两个%%号: 这个是查询任意位置的字母满足条件即可,只有首字母是进行索引排序的,其他
    位置的字母都是相对无序的,所以查找任意位置的字母是用不上索引的.

索引优化原则总结
最左前缀法则要遵守
索引列上不计算
范围之后全失效
覆盖索引记住用。
不等于、is null、is not null、or导致索引失效。
like百分号加右边,加左边导致索引失效,解决方法:使用覆盖索引。

实战经验——待整理

针对子查询使用 EXISTS

分页查询慢怎么办?
在这里插入图片描述
明明有索引就是不走怎么办?
在这里插入图片描述
带头大哥丢了怎么办?
在这里插入图片描述
ORDER BY慢怎么办?
在这里插入图片描述
有合适的索引不走怎么办?
在这里插入图片描述
优化count()
高性能MySQL——6.7.1

优化limit
高性能MySQL——6.7.5

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

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

相关文章

Matlab之统计一维数组直方图 bin 计数函数histcounts

一、语法 [N,edges] histcounts(X) [N,edges] histcounts(X,nbins) [N,edges] histcounts(X,edges) 解释&#xff1a; 1.1 [N,edges] histcounts(X) 将 X 的值划分为多个 bin&#xff0c;并返回每个 bin 中的计数以及 bin 边界。histcounts 函数使用自动分 bin 算法&am…

Visual Studio编译出来的程序无法在其它电脑上运行

在其它电脑&#xff08;比如Windows Server 2012&#xff09;上运行Visual Studio编译出来的应用程序&#xff0c;结果报错&#xff1a;“无法启动此程序&#xff0c;因为计算机中丢失VCRUNTIME140.dll。尝试重新安装该程序以解决此问题。” 解决方法&#xff1a; 属性 -> …

python实例方法,类方法和静态方法区别

为python中的装饰器 实例方法 实例方法时直接定义在类中的函数&#xff0c;不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法&#xff0c;是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…

春秋云镜 CVE-2019-12422

春秋云镜 CVE-2019-12422 Shiro < 1.4.2 cookie oracle padding漏洞 靶标介绍 Apache Shiro是美国阿帕奇&#xff08;Apache&#xff09;软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro 1.4.2之前版本中存在安全漏洞。当Apache Shiro使…

BM80 买卖股票的最好时机(一)

目录 1.题目描述 2.题目分析 3.编写代码 4.总结 这是牛客网上的一道题目 1.题目描述 题目链接&#xff1a;买卖股票的最好时机(一)_牛客题霸_牛客网 (nowcoder.com) 2.题目分析 我们看到这个题目中一个数组表示每一天的股价&#xff0c;那么最大利润怎么算呢&#xff0c…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

【核磁共振成像】部分傅里叶重建

目录 一、部分傅里叶重建二、部分傅里叶重建算法2.1 填零2.2 零差处理 一、部分傅里叶重建 在部分傅里叶采集中&#xff0c;数据并不是绕K空间中心对称收集的&#xff0c;而是K空间的一半是完全填充的&#xff0c;另一半只收集了一小部分数据。   部分傅里叶采集所依据的原理…

bindService的调用流程

使用bindService去调用service&#xff0c;如果有多个客户端调用&#xff0c;onBind方法只会被调用一次&#xff0c;由于bindService嗲处理中&#xff0c;AMS是一个中间商&#xff0c;猜测这个处理也是AMS里进行的&#xff0c;这里我们再看看bindService的调用流程 public clas…

剑指 Offer 19. 正则表达式匹配(C++实现)

剑指 Offer 19. 正则表达式匹配https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/ 动态规划&#xff1a;通过dp数组剪枝 只需要对各种情况进行分类处理即可 vector<vector<int>> dp;bool helper(const string& s, const int i, const string&am…

R语言常用数学函数

目录 1. - * / ^ 2.%/%和%% 3.ceiling,floor,round 4.signif,trunc,zapsamll 5.max,min,mean,pmax,pmin 6.range和sum 7.prod 8.cumsum,cumprod,cummax,cummin 9.sort 10. approx 11.approx fun 12.diff 13.sign 14.var和sd 15.median 16.IQR 17.ave 18.five…

YOLOv5、YOLOv8改进:NAMAttention注意力机制

目录 1.简介 2.YOLOv5代码修改 2.1增加以下NAMAttention.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 paper:https://arxiv.org/pdf/2111.12419.pdf code:https://github.com/Christian-lyc/NAM 摘要 注意机制是近年来人们普遍关注的研究兴趣之一。它帮助…

day 28 地图

from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 创建一个地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 399),("广东省", 499) ] # 添加数据 map map.add(&qu…

Redis数据结构全解析【万字详解】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O&#xff08;1&#xff09;复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

Python小知识 - 八大排序算法

八大排序算法 排序算法是计算机科学中非常重要的一个研究领域。排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在计算机内部&#xff0c;而外部排序是数据记录在计算机外部&#xff0c;这里我们主要讨论内部排序。 内部排序中的算法大致可以归纳为四类&…

Matlab图像处理-乘法运算

乘法运算 两幅图像进行乘法运算主要实现两个功能&#xff1a; 一是可以实现掩模操作&#xff0c;即屏蔽图像的某些部分&#xff1b; 二是如果一幅图像乘以一个常数因子&#xff0c;如果常数因子大于1&#xff0c;将增强图像的亮度&#xff0c;如果因子小于1则会使图像变暗。…

day 28 折线图

from pyecharts.charts import Line from pyecharts.options import TitleOpts, LabelOpts# 分别打开三哥国家文件 import jsonf_us open("D:/美国.txt", "r", encoding"UTF-8") f_jp open("D:/日本.txt", "r", encoding&…

OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV不仅能够处理图像&#xff0c;还能够处理视频。视频是由大量的图像构成的&#xff0c;这些图像是以固定的时间间隔从视频中获取的。这样&#xff0c;就能够使用图像处理的方法对这些图像进行处理&#xff0c;进而达到…

无涯教程-Python机器学习 - Unsupervised Learning函数

无监督学习 顾名思义,它与监督式机器学习方法或算法相反,这意味着在无监督的机器学习算法中,我们没有任何监督者可以提供任何类型的指导。在没有监督学习算法那样的自由的情况下,无监督学习算法非常方便,因为在这种情况下我们没有预先标签训练数据,而我们想从输入数据中提取有…

学信息系统项目管理师第4版系列03_文件与标准

审核未通过&#xff0c;删除文件部分&#xff0c;仅保留标准化相关内容&#xff0c;重发 12. 标准化 12.1. 采用国际标准和国外先进标准的程度分为等同采用、修改采用和等效采用 3 种 12.1.1. 【高21上选20】 12.1.2. 采用指与国际标准在技术内容和文本结构上相同,或者与国…

图的邻接矩阵与邻接表

目录 一、图的概念 二、邻接矩阵 2.1 邻接矩阵存储 2.2 邻接矩阵结构 2.3 构造邻接矩阵 2.4 边的添加 三、邻接表 3.1 邻接矩阵存储 3.2 邻接表结构 3.3 构造邻接表 3.4 边的添加 三、 图的遍历 一、图的相关概念 图是由顶点集合及顶点间的关系组成的一种数据结构&…