当前位置: 首页 > news >正文

MySQL中EXPLAIN关键字解释

什么是MySQL的索引
        索引是帮助MySQL高效获取数据的数据结构
        MySQL再存储数据之外,数据库系统中还维护者满足特定查找算法的数据结构,这些数据结构以某种引用表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据,而这种数据结构就是索引。
        简单理解为,“排好序的可以快速查找数据的数据结构”
索引数据结构
        二叉树数据结构
                弊端:当极端情况下,数据递增插入是,会一直向右插入,形成链表,查询效率会降低
        MySQL中常用地索引数据结构有BTree索引(MyISAM存储引擎),B+Tree索引(Innodb存储引擎),Hash索引(memory存储引擎)等等。
索引优势
        提高数据检索的效率,降低数据库的IO成本
        通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
索引劣势
        索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的,在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件,每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。
索引使用场景
        推荐建立索引:
                主键自动建立唯一索引
                频繁作为查询条件的字段应该创建索引(where后面的语句)
                查询中与其他表关联的字段,外键关系建立索引
                多字段查询下倾向创建组合索引
                查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
                查询中统计或者分组字段
不推荐建立索引
                表记录太少
                经常增删改查
                where条件里用不到的字段不建立索引
索引分类
        主键索引
                表中的列设定为主键后,数据库会自动建立主键索引
                单独创建和删除主键索引语法
                        创建主键索引语法:alter table 表名 add primary key (字段)
                        删除主键索引语法:alter table 表名 drop primary key;
        唯一索引
                表中的列创建了唯一约束时,数据库会自动建立唯一索引。
                单独创建和删除唯一索引语法:
                        创建唯一索引语法:alter table 表名 add unique 索引名(字段)或create unique index 索引名 on 表名(字段)
                        删除唯一索引语法:drop index 索引名 on 表名
        单值索引(即一个索引只包含单个列,一个表可以有多个单值索引)
                建表时可随表一起建立单值索引
                单独创建和删除单值索引:
                        创建单值索引:alter table 表名 add index 索引名(字段)或create index 索引名 on 表名(字段)
                        删除单值索引:drop index 索引名 on 表名;
        复合索引(即一个索引包含多个列)
                建表时可随表一起简历复合索引
                单独创建和删除复合索引:
                        创建复合索引:create index 索引名 on 表名(字段1,字段2);或alter table 表名 add index 索引名(字段1,字段2);
                        删除复合索引:drop index 索引名 on 表名;
性能分析

MySQL常见瓶颈
        SQL中对大量数据进行比较、关联、排序、分组时CPU的瓶颈
        实例内存满足不了缓存数据或排序等需要,导致产生大量的物理IO。查询数据是扫描过多数据行,导致查询效率低。
Explain
        使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。可以用来分析查询语句或是表的结构的性能瓶颈。其作用:
                表的读取顺序
                哪些索引可以使用
                数据读取操作的操作类型
                哪些索引被实际使用
                表之间的引用
                每张表有多少行被优化器查询
        explain关键字使用起来比较简单:explain + sql 语句
        explain重要字段名
                id
select查询的序列号,表示查询中执行select子句或操作表的顺序
id相同时,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,则先被执行
id相同和不同都存在是,id相同的可以理解为一组,从上往下顺序执行,所有组中,id值越大,优先级越高越先执行。
select_type
simple:简单的select查询,查询中不包含子查询或者union
primary:查询中若包含任何复杂的子部分,最外层查询则被标记为primary
derived:在from列表中包含的子查询被标记为derived(衍生),mysql会递归执行这些子查询,把结果放在临时表里。
subquery:在select或where列表中包含了子查询。
table:显示这一行的数据是关于哪张表的
type
system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快,如将主键置于where列表中,mysql就能将该查询转换为一个常量。
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该数据查找和扫描的混合体。
range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
index:full index scan,index与all区别为index类型只遍历索引树。这通常比all快,因为索引文件通常比数据文件小,也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的。
all:full table scan,将遍历全表以找到匹配的行。
从最好到最差依次是system>const>eq_ref>ref>range>index>all。一般来说,最好保证查询能达到range级别,最好能达到ref。
possible_keys:显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上如果存在索引,则该索引将会被列出来,但不一定会被查询实际使用上。
key:查询中实际使用的索引,如果为null,则没有使用索引
ref:显示索引的哪一列被使用了,哪些列或常量被用于查找索引列上的值
rows:rows列显示MySQL认为它执行查询时必须检查的行数,一般越少越好。
extra:一些常见的重要的额外信息:
using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”(排序时没有使用索引,需要优化)
Using temporary:MySQL在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。(分组时没有使用索引,需要优化)
Using index:表示索引被用来执行行索引键值的查找,避免访问了表的数据行,效率不错。
Using where:表示使用了where过滤。
查询优化

索引失效
最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。
不在索引列上做任何计算、函数操作,会导致索引失效而转向全表扫描。
存储引擎不能使用索引中范围条件右边的列。
MySQL在使用不等于时无法使用索引会导致全表扫描。
is null 可以使用索引,但是is not null无法使用索引。
like以通配符开头会使索引失效导致全表扫描。
字符串不加单引号索引会失效。
使用or连接时索引失效
建议:
and会自动调整顺序为最左前列
对于单值索引,尽量选择针对当前查询字段过滤性更好的索引
对于组合索引,当前where查询中过滤性更好的字段在索引字段顺序中位置越靠前越好
对于组合索引,尽量选择能够包含在当前查询中where子句中更多字段的索引
尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
排序优化
尽量避免使用Using FileSort方式排序
order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。
where子句中如果出现索引范围查询会导致order by索引失效。
关联查询优化:内连接时,MySQL会自动把小结果集的选为驱动表,所以大表的字段最好加上索引,左外连接时,左表会全表扫描,所以右边大表字段最好加上索引,右外连接同理,我们最好保证被驱动表上的字段建立了索引。
慢查询日志

慢查询日志简介:mysql的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超越阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中,可以由它来查看哪些SQL超出了我们最大忍耐时间值。
慢查询日志使用
默认情况下,MySQL数据库没有开启慢查询日志,需要手动设置参数。
查看是否开启:show variables like '%slow_query_log%';
开启日志:set global slow_query_log = 1;
设置时间:set global long_query_time=1;
查看时间:show vari ables like 'long_query_time%';
查看超时的SQL记录日志:MySQL的数据文件夹下:5.5/Data/设备名称-slow.log
注意:非调优场景下,一般不建议启动改参数,慢查询日志支持将日志记录写入文件,开启慢查询日志会或多或少带来一定的性能影响。 作者:云中吕行 https://www.bilibili.com/read/cv22006632/?jump_opus=1 出处:bilibili

相关文章:

MySQL中EXPLAIN关键字解释

什么是MySQL的索引 索引是帮助MySQL高效获取数据的数据结构 MySQL再存储数据之外&#xff0c;数据库系统中还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用表中的数据&#xff0c;这样我们就可以通过数据结构上实现的高级查找算法来快速…...

初始JavaScript详解【精选】

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍初始JavaScript以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 目录 ⭐…...

计数排序,基数排序及排序总结

稳定性&#xff1a;当要排序的数组有相同数据时&#xff0c;排序后相同数据的相对位置不变&#xff0c;则称该排序算法稳定&#xff0c;否则即为不稳定. 在这里我在说说计数排序吧&#xff0c;计数排序就是将给定数组中的数进行计数&#xff0c;在从小到大依次输出即可。简单过…...

【LeetCode】459. 重复的子字符串(KMP2.0)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;459. 重复的子字符串 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 看到题目的第一想法(可以贴代码&#xff09; 1.…...

CSS(五) -- 动效实现(立体盒子旋转-四方体+正六边)

一. 四面立体旋转 正方形旋转 小程序中 wxss中 <!-- 背景 --><view class"dragon"><!--旋转物体位置--><view class"dragon-position"><!--旋转 加透视 有立体的感觉--><view class"d-parent"><view …...

Win10使用OpenSSL生成证书的详细步骤(NodeJS Https服务器源码)

远程开启硬件权限&#xff0c;会用到SSL证书。 以下是Win10系统下用OpenSSL生成测试用证书的步骤。 Step 1. 下载OpenSSL,一般选择64位的MSI Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 一路点下来&#xff0c;如果后续请你捐款&#xff…...

sql_lab之sqli中的堆叠型注入(less-38)

堆叠注入&#xff08;less-38&#xff09; 1.判断注入类型 http://127.0.0.3/less-38/?id1 and 12 -- s 没有回显 http://127.0.0.3/less-38/?id1 and 11 -- s 有回显 则说明是单字节’注入 2.查询字段数 http://127.0.0.3/less-38/?id1 order by 4 -- s 报错 http:/…...

第5章-第3节-Java中对象的封装性以及局部变量、this、static

1、局部变量 【问题1】&#xff1a;什么是局部变量&#xff1f; 答&#xff1a;定义在局部位置的变量就是局部变量。 【问题2】&#xff1a;什么是局部位置&#xff1f; 答&#xff1a;方法的形参位置、方法体的内部。 【位置关系图】&#xff1a; class Xxx { //成员位…...

IP应用场景的规划

IP地址作为互联网通信的基石&#xff0c;在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展&#xff0c;探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…...

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…...

计算机网络 网络安全技术

网络安全基本要素 机密性 不泄密完整性 信息不会被破坏可用性 授权用户 正常有效使用可控性 被控制可审查性 网络安全的结构层次 物理安全 物理介质安全控制 计算机操作系统安全服务 应用层次 被动攻击 :截获信息 主动攻击 : 中断信息,篡改,伪造 篡改 …...

WebAssembly 的魅力:高效、安全、跨平台(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

二维码智慧门牌管理系统升级:确保公安机关数据安全无忧

文章目录 前言一、多重安全防护措施二、安全措施综述与展望 前言 数据安全挑战与重要性 在数字化社会&#xff0c;数据安全对公共管理机构&#xff0c;尤其是公安机关而言&#xff0c;至关重要。随着二维码技术在门牌管理系统中的广泛应用&#xff0c;管理变得更智能、更便捷。…...

Golang leetcode59 螺旋矩阵

螺旋矩阵 leetcode59 初次尝试&#xff0c;从中心向外 func main() {n : 3fmt.Println(generateMatrix(n)) }// 初版&#xff0c;我们从中心点开始 func generateMatrix(n int) [][]int {//1.nXn矩阵table : make([][]int, n)for i : 0; i < n; i {table[i] make([]int, …...

深度学习(Deep Learning) 简介

深度学习&#xff08;Deep Learning&#xff09; 深度学习在海量数据情况下的效果要比机器学习更为出色。 多层神经网络模型 神经网络 有监督机器学习模型 输入层隐藏层 (黑盒)输出层 概念: 神经元 Neuron A^(n1)网络权重 Weights W^n偏移 bias b^n 激活函数: ReLUtan…...

服务器raid中磁盘损坏或下线造成阵列降级更换新硬盘重建方法

可能引起磁盘阵列硬盘下线或故障的情况&#xff1a; 硬件故障&#xff1a; 硬盘物理损坏&#xff1a;包括但不限于坏道、电路板故障、磁头损坏、盘片划伤、电机故障等。连接问题&#xff1a;如接口损坏、数据线或电源线故障、SATA/SAS控制器问题等。热插拔错误&#xff1a;在不…...

Ubuntu 常用命令之 exit 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 exit命令在Ubuntu系统下用于结束一个终端会话。它可以用于退出当前的shell&#xff0c;结束当前的脚本执行&#xff0c;或者结束一个ssh会话。 exit命令的参数是一个可选的整数&#xff0c;用于指定退出状态。如果没有指定&#…...

依托亚马逊云科技构建韧性应用

背景 现代业务系统受到越来越多的韧性相关的挑战&#xff0c;特别是客户要求他们的业务系统 724 不间断的运行。因此&#xff0c;韧性对于云的基础设施和应用系统有着至关重要的作用。 亚马逊云科技把韧性视为一项最基本的工作&#xff0c;为了让我们的业务系统能持续优雅地提供…...

Prometheus-JVM

一. JVM监控 通过 jmx_exporter 启动端口来实现JVM的监控 Github Kubernetes Deployment Java 服务&#xff0c;修改 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar# 编写配置文件&#xff0…...

flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1

阅读此文默认读者对docker、docker-compose有一定了解。 环境 docker-compose运行了一个jobmanager、一个taskmanager和一个sql-client。 如下&#xff1a; version: "2.2" services:jobmanager:image: flink:1.18.0-scala_2.12container_name: jobmanagerports:…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...