性能调优知识点(mysql)二

news2024/9/28 7:47:15

** 调优工具**
A.Explain
查看sql执行计划

各列详解
mysql5.7及之后的版本无需加extended会自动展示partitions和filtered两列

explain紧随其后通过 show warnings 命令可
以得到优化后的查询语句,从而看出优化器优化了什么。
explain extended select * from eme_task_info LEFT JOIN jcwb_dayplan on 1=1 LEFT JOIN jcw_jdl_wl_record on 1=1;
show warnings;

//rows: mysql估计要读取并检测的行数,为一个估算值,该值越小越好
//filtered: 该操作返回的结果集行数占检测行数的百分比,为一个估算值,值越大越好
//rows * filtered / 100 = 实际返回的结果集行数,为一个估算值,该值越小越好
//partitions : 表示查询语句涉及的分区数。如果查询语句使用了分区表的一个分区,则该列的值为1。如果查询语句使用了分区表的多个分区,则该列的值为涉及的分区数。
//由于mysql是支持多线程并发操作的,如果用hashmap来存储的话就会有并发问题,所以为了解决这个问题,就需要对整个hashmap加锁(相当于使用hashtable),但是对这个hashmap加锁会影响性能,所以mysql5.7以后就引入了分区的概念,原来只有一个hashmap,5.7以后分为了8个hashmap。每个索引都绑定到一个特定的分区,每个分区都由一个单独的 latch 锁保护。相当于将索引分散存储,减小(减小而不是去除)加锁带来性能的影响。分区大小可以设置,默认情况下设置为8,最大设置为512。

id列
id列的编号是 select 的序列号,有几个 select 就有几个id。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
left join的两张表id是一样的,即他们是同一层级,子表的id才是不同级,子表id更大。具体看有道笔记。

select_type列
( 表示对应行是简单还是复杂的查询)
表示对应行是简单还是复杂的查询。
主要包括以下几种,但不只以下几种,还会有其它的。具体查看官方文档。
1.simple 简单查询。只有一个select语句
2.primary 复杂查询。最外层的select
3.subquery表示子查询,from的子句不算。
4.derived。from后面的子查询语句,叫衍生查询或派生查询

table列
(表示 explain 的一行正在访问哪个表)
这一列表示 explain 的一行正在访问哪个表。 当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查 询。 当有 union 时,UNION RESULT 的 table 列的值为,1和2表示参与 union 的 select 行id。
derived3表示id为3的select

type列
(如何查找表中的行,索引、全表还是其他)
主要包括以下几种,但不只以下几种,还会有其它的。具体查看官方文档。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
a.NULL
(不需要访问表,在优化节点在索引列中获取)
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引,但很少有这么简单的sql。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表
1 mysql> explain select min(id) from film;
b.const
(表示通过索引一次就找到了)
表中只有一条数据匹配。比如id=1。如sql select * from film where id = 1。就像读取常量一样。
c.system
(表只有一行记录)
表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个系统表只有一行记录,所以可以忽略。
查询效率更高,比const高。
d.eq_ref
(表示使用主键索引/唯一索引,且最多只返回一条数据)
primary key主键索引或 unique key唯一 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记。
e.ref
(表示使用普通索引,或者唯一索引的部分前缀)
表示使用普通索引,或者唯一索引的部分前缀,索引要和某个值相比较,可能会找
到多个符合条件的行,所以会比eq_ref效率低点。
普通索引,比如简单 select 查询,name是普通索引。比如sql
explain select * from film where name = ‘film1’;
唯一索引的部分前缀,如关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分。。比如sql
explain select film_id from film left join film_actor on film.id = film_actor.film_id;
f.range
范围查找,范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
g.index
(需要扫描全部索引才能获取到数据,index会从二级索引的叶子节点开始遍历,而不是从根节点开始遍历,速度比较慢)
扫描全索引就能拿到结果(即只需要查找所有就能拿到结构,只不过是需要扫描所有所有才能拿到),一般是扫描某个二级索引(非主键索引,不是联合索引),这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。
index虽然用到索引,但是效率不高,因为会遍历索引中的所有值,而且索引也是存在磁盘中的。
h.ALL
(会扫描聚簇索引所有叶子节点)
即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。扫描二级索引比全表扫描(扫描聚簇索引)效率高点。

key列
(实际采用哪个索引来优化对该表的访问)
如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

possible_keys列
(可能使用哪些索引来查找)
explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。 如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。

key_len列
(可以看出使用索引的哪些列)
a.这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
举例来说,film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。通
过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找
b.key_len计算规则如下:
1.字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
char(n):如果存汉字长度就是 3n 字节
varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为
varchar是变长字符串
2.数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
3.时间类型
date:3字节
timestamp:4字节
datetime:8字节
4.如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索
引。
c.上面说了varchar key_len=3n+2,这只是针对字段的字符集为utf8mb3的时候,表示一个汉字占3个字节。
但是当字段字符集为utf8mb4的时候,一个汉字占用4个字节,此时key_len=50*4+2=202

ref列
(使用到的索引列或常量,具体看笔记)
a.这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量)或者字段名(例:film.id)
下面igmc ref用到的是const
select * from im_group_msg_content igmc
where igmc.CREATE_BY = '12’and igmc.sender_id=‘12’
b.下面igmc因为使用的了like,为范围range索引,所以ref为null。
ig用到igmc.id=ig.git,所以ref为字段名
select * from im_group_msg_content igmc
left join im_group ig on igmc.gid=ig.gid
where igmc.CREATE_BY like '12’and igmc.sender_id=‘12’

rows列(估计要扫描的行数)
不是结果集里的行数count,是预估扫描的行数,具体要看情况。

Extra列(展示的额外信息)
a. Using index(使用覆盖索引)
表示sql查询语句使用的是覆盖索引
b.Using where(没走索引,需要优化)
普通的查询,使用 where 语句来处理结果
c.Using index condition(不完全被索引覆盖,查询的是范围值)
查询的列不完全被索引覆盖,where条件是一个范围而不是具体值
比如select * from film_actor where film_id > 1;
d.Using temporary(表示会创建临时表处理查询,需要优化)
需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
比如
1.actor表name是没有建索引的,此时创建了张临时表来distinct,所以查询的时候,会将所有字段查询出来,放到临时表,然后筛选出name列所有值。
mysql> explain select distinct name from actor;
2.film.name建立了idx_name索引,此时查询时extra是using index,没有用临时表
mysql> explain select distinct name from film;
e.Using filesort(不走索引,通过外部进行排序,需要优化)
将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
外部排序比如内存、磁盘
f.Select tables optimized away(使用聚合函数如max、min在索引中查询,这种效率高,无需优化)
使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时。这种效率高,无需优
化。

B.Trace
mysql最终如何选择索引,我们可以用trace工具来查看。
开启trace工具会影响mysql性能,所以只能临时分析sql使用,用完之后立即关闭

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

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

相关文章

0基础学习PyTorch——GPU上训练和推理

大纲 创建设备训练推理总结 在《Windows Subsystem for Linux——支持cuda能力》一文中&#xff0c;我们让开发环境支持cuda能力。现在我们要基于《0基础学习PyTorch——时尚分类&#xff08;Fashion MNIST&#xff09;训练和推理》&#xff0c;将代码修改成支持cuda的训练和推…

[sql-03] 求阅读至少两章的人数

准备数据 CREATE TABLE book_read (bookid varchar(150) NOT NULL COMMENT 书籍ID,username varchar(150) DEFAULT NULL COMMENT 用户名,seq varchar(150) comment 章节ID ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT 用户阅读表insert into book_read values(《太子日子》…

MindSearch 部署到Github Codespace 和 Hugging Face Space

和原有的CPU版本相比区别是把internstudio换成了github codespace。 教程是https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/MindSearch/readme_github.md 复现步骤&#xff1a; 根据教材安装环境和创建硅基流动 API 然后启动前后端 然后按照教材部署到 Huggi…

安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型

案例介绍 在全球制造业加速数字化的背景下&#xff0c;工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护&#xff0c;以及跨地域的管理协作等挑战&#xff0c;由于场地分散和突发状况的不可预知性&#xff0c;传统方式已无法…

计算机的错误计算(一百零六)

摘要 探讨含有变元负的整数次方的多项式的计算精度问题。 计算机的错误计算&#xff08;一百零五&#xff09;给出了一个传统多项式的错误计算案例&#xff1b;本节探讨含有变元负的整数次方的多项式的计算精度问题。 例1. 已知 计算 若在Python下计算&#xff0c;则有&…

猎板PCB大讲堂:PCB谐振效应及其对设计的影响

在PCB设计中&#xff0c;谐振效应是一个不可忽视的问题&#xff0c;它可能导致信号完整性问题、电源分配系统&#xff08;PDS&#xff09;工作异常&#xff0c;甚至成为EMI辐射源。以下是关于PCB谐振效应的一些详细信息&#xff1a; 1. 谐振产生的原因&#xff1a; - PCB中…

d2l | 目标检测数据集:RuntimeError: No such operator image::read_file

目录 1 存在的问题2 可能的解决方案3 最终的解决方案3.1 方案一&#xff08;我已弃用&#xff09;3.2 方案二&#xff08;基于方案一&#xff09;3.3 方案三&#xff08;基于方案一&#xff09; 1 存在的问题 李沐老师提供的读取香蕉数据集的函数如下&#xff1a; def…

Ubuntu系统设置bond双网卡

这里我的服务器是Ubuntu 22.04.3 LTS,是高阶版本,设置网卡需要通过netplan 根据你的Ubuntu版本(如使用Netplan或/etc/network/interfaces),选择相应的配置方法。 我这边以root用户登录进服务器,就不需要普通用户每次在命令前添加sudo 1.通常/etc/netplan下配置文件名形…

IDEA开发SpringBoot项目基础入门教程。包括Spring Boot简介、IDEA创建相关工程及工程结构介绍、书写配置文件、Bean对象管理等内容

文章目录 0. 关于本文1. 概述1.1 Spring简介1.2 Spring Boot简介1.3 传统的开发方式1.3.1 简述1.3.2 缺点 1.4 Spring Boot的优点 2. 创建一个简单的Spring Boot应用程序2.1 在IDEA创建项目2.2 pom配置文件内容2.3 启动类2.4 创建Controller 3. 从Maven工程创建Spring Boot工程…

数据结构~二叉搜索树

文章目录 一、二叉搜索树的概念二、二叉搜索树的结构二叉搜索树的性能分析二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除 三、二叉搜索树key和key/value使用场景四、二叉搜索树的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

jmeter-请求参数加密-MD5加密

方法1 &#xff1a;使用jmeter自带的函数助手digest Tool(工具)---Function Helper Dialog(函数助手对话框) 第一个参数是要md5加密的值&#xff0c;第二个参数是保存加密后值的变量 &#xff08; 此处变量是从txt文件导入的&#xff0c;所以使用的是${wd} &#xff09; …

excel统计分析(1):列联表分析与卡方检验

列联表&#xff1a;用于展示两个或多个分类变量之间频数关系的表格。——常用于描述性分析卡方检验&#xff1a;通过实际频数和期望频数&#xff08;零假设为真情况下的频数&#xff09;&#xff0c;反映了观察频数与期望频数之间的差异程度&#xff0c;来评估两个变量是否独立…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中&#xff0c;我们学习了目标的IP地址&#xff0c;端口&#xff0c;服务&#xff0c;操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用&#xff0c;因为我们可以快速查找系统上运行的服…

System Timer (STM)

文章目录 1. 介绍2. 功能特性3. 应用场景4. 功能介绍4.1 TIME0 ~TIME6计数器精度与定时范围4.2 比较器工作原理4.3 中断处理 5. Ifx Demo5.1 STM_Interrupt_1_KIT_TC277_TFT5.2 STM_System_Time_1_KIT_TC275_LK5.3 SMU_Reset_Alarm_1_KIT_TC275_LK 1. 介绍 Ifx TC37x拥有3个自…

前端大模型入门:使用Transformers.js实现纯网页版RAG(一)

我将使用两篇文章的篇幅&#xff0c;教大家如何实现一个在网页中运行的RAG系统。本文将其前一半功能&#xff1a;深度搜索。 通过这篇文章&#xff0c;你可以了解如何在网页中利用模型实现文本相似度计算、问答匹配功能&#xff0c;所有的推理都在浏览器端本地执行&#xff0c;…

C语言-IO

一,阻塞IO与非阻塞IO 简介: IO的本质是基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的 IO 方式&#xff08;模型&#xff09;&#xff0c;比较常见的有下列三种 阻塞型IO模型 非阻塞型IO模型 多路复用IO模型 在 C 语言中&#…

牛客SQL练习详解 02:条件查询

牛客SQL练习详解 02&#xff1a;条件查询 1、基础排序sql36 查找后排序sql37 查找后多列排序sql38 查找后降序排列 2、基础操作符sql6 查找学校时北大的学生信息sql7 查找年龄大于24岁的用户信息sql8 查找某个年龄段的用户信息sql9 查找chuchu 3、高级操作符sql11 高级操作符练…

认知杂谈91《菜鸟的自我修炼:减少过度干预》

内容摘要&#xff1a;          在投资和生活中&#xff0c;动作过多往往因情绪波动和缺乏计划而引发亏损。历史上的安史之乱和现代投资中的频繁交易都是例证。要管理情绪&#xff0c;首先要认识自己的情绪模式&#xff0c;然后改变消极的思考方式&#xff0c;并通过合…

『USB3.0Cypress』QT基于cyusb_linux_1.0.5开发上位机

文章目录 1.CyUSB Suite2.搭建开发环境3.Cyusb的应用4.疑问解决5.传送门1.CyUSB Suite CyUSB Suite for Linux是一个围绕现有开源用户空间USB库libusb的wrapper。CyUSB套件通过围绕libusb的简化包装器以及在下载固件后提供用于测试外围设备的基础设施,让您快速入门。换句话说…

1.6 物理层

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 物理层的基本概念1.1 定义1.2 作用1.3 物理层的主要任务 2 数据通信的基础知识2.1 常用术语2.2 信号2.3 码元2.4 信道2.5 数据通信系统模型 3 信道的极限容量3.1 基本术…