学习之-Mysql Sql 优化之 Explain

news2024/11/15 11:05:26

在开发中,往往遇到一些慢查询语句, 我们需要对慢查询进行优化。Explain工具就是用来分析某个慢查询执行情况的工具。通过在select 语句前加上explain 关键字,然后执行就会得到某个sql 执行计划信息,通过分析执行计划,我们就可以确定是否需要对其进行优化。

但是要想优化sql ,首先要能读懂执行计划,下面就explain执行计划相关字段针对个人理解进行解释:

表结构:三个表,actor 演员表,只有主键,没有其他索引;film 电影表,除主键外,有普通索引name;film_actor 两表的关联表,film_id,actor_id 形成联合索引。

Explain 中相关的列:

执行 explain select * from film where id = 1; 我们得到如下执行计划,计划中包含id,select_type,table,type,possible_keys,key,key_len,ref,rows,filtered,extra.

id :  执行计划序号列,我觉得也可以看成执行计划执行顺序列,号越大,越先执行。id 若相同,从上至下执行,若为null ,则最后执行。

select_type:

       主要值有SIMPLE,PRIMARY,SUBQUERY,DERIVED。

  • SIMPLE:表示当前查询为简单查询,没有union,子查询等。
  • PRIMARY:在复杂查询中,当前执行计划对应的查询会返回最终查询结果。也就是复杂查询中,最外层的select 。
  • SUBQUERY:指在select 中的而不在from 中的查询。
  • DERIVED:在from 子句中的子查询语句。该语句结果,数据库会使用临时表进行存储。

示例:explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;

 其中,select 1 from actor where id = 1 为subquery;select * from film where id = 1 为derived.

table:

        执行计划中,对应sql 需要查询的表。

partitions:

        表进行分区时,该字段才会有值,可以不用太关注。

type:

        表示当前执行计划,查询类型,用以表示查询对应的数据范围。由最优到最差的值排列为:        system > const > eq_ref > ref > range > index > ALL

其中system,const 表示,当前查询使用primary key , unique key 进行匹配查询时,最多只有一条数据返回,数据库可以转化为类似于查询常量的方式进行查询。system 是const 的一种特例,表里只有一条数据匹配时,为system。

示例:explain extended select * from (select * from film where id = 1) tmp; 

select * from film where id = 1 使用主键,匹配常量1,获得唯一记录,存储于临时表中,该语句type 所以为const ,而临时表中,目前仅有一条数据可以匹配,则type 为system .

eq_ref , 则是当使用primary key 或者unique key 进行关联查询时,最多只会返回一条符合条件的记录,此时type 值则为eq_ref. 相较于const 效率稍差。

示例:explain select * from film_actor left join film on film_actor.film_id = film.id;

 以上语句使用主键进行关联查询时,对film 来说 一个id 只会有一条数据。

ref:当使用普通索引或者唯一索引前缀,进行查询时。

示例:explain select * from film where name = 'film1';

以上为使用普通索引 name 进行查询

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

 以上查询,使用了film_actor的联合索引的前置字段film_id 进行了关联查询。

range: 范围扫描,通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。

示例:explain select * from actor where id > 1;

index: 表示查询时,使用全索引扫瞄即可获得所有结果时的值。一般指二级索引,同时,此时select 中的字段,也全部包含在了索引文件中,索引这种情况下也叫使用了覆盖索引。

示例:explain select * from film;

 比如,上面的语句,使用了name 普通索引,因为表film 中只有id 和name 两个字段,二级索引idx_name索引文件中刚好全部包含了所有列。这种情况下数据库可以不用回表查询,同时因为二级索引文件大小一般比聚集索引文件要大,所以数据库在执行上述sql 时会优化直接使用二级索引。

all:该值为效率最差的,会进行全表扫描。会从左到右扫描聚集索引的所有叶子结点数据。该值,表数据较大的话,则需要进行优化了。

示例:explain select * from actor;

比如演员表中,仅有聚集索引。所以上述查询无法优化至其他二级索引进行查询。

possible_keys: 

表示执行计划对应的sql 可能使用的索引。若为null 则可能数据表中数据很少,数据库可能觉得不值当进行索引查询,所以选择直接进行全表扫描

key:

表示执行计划对应的sql 使用的索引。如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

key_len:

表示执行sql时用到索引的长度。

示例:explain select * from film_actor where film_id = 2;

比如上述sql,使用了film_actor 中的联合索引,长度为4. 为什么是4呢,因为film_id为int 类型,数据库中长度为4,占4个字节。所以表示使用了联合索引的前置字段,且长度为4.

ref列:

表查找值所用到的列或常量。

rows列:

估计要读取并检测的行数,不是结果集里的行数。  

Extra列:

展示的是额外信息,常用值:

Using index:使用覆盖索引

示例:explain select film_id from film_actor where film_id = 1;

Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖

Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围

示例:explain select * from film_actor where film_id > 1;

Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

示例:explain select distinct name from actor;

 Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。

示例:explain select * from actor order by name;

Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段

示例:explain select min(id) from film;

上述语句,使用min 函数获取film 中id 最小的值,因为聚集索引是排好序的,只需要拿到第一个数据即可直接返回,根本不需要再查询表使用任何索引。所以数据库对语句进行了优化。

学习日记,结束。 

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

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

相关文章

vue相关知识导学

学习资料 Vue 相关源码地址&#xff1a; vue2.0 GitHub - vuejs/vue: This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/coreVue3.0 GitHub - vuejs/core: &#x1f596; Vue.js is a progressive, incrementally-adoptable JavaScri…

【从0到1了解Libarchive】Libarchive的用途意义以及成功入门Libarchive

目录 0 如果你还不知道Libarchive是什么请一定要先看一下 1 简介 1.1 为什么实现Libarchive 1.2 到底都有谁在用呢&#xff1f; 1.3 Libarchive都有哪些功能 1.4 我们可以通过这些获取更多信息 1.5 如何贡献 2 Libarchive归档与压缩 3 Libarchive编译 4 Libarchive简…

maven gpg报错:no default secret key: No secret key signing failed: No secret key

一、问题描述 我这边情况是这样的&#xff0c;原本在A电脑上&#xff0c;通过maven打包安装都是好的&#xff0c;最近新弄了台电脑&#xff0c;然后把A电脑的gpg秘钥通过Kleopatra的方式直接导出来 然后在B电脑上通过Kleopatra导入&#xff0c;整了很久&#xff0c;在IDEA中执…

FreeRTOS 事件标志组

文章目录 一、事件标志组简介二、创建事件标志组1. 函数 xEventGroupCreate()2. 函数 xEventGroupCreateStatic() 三、设置事件位1. 函数 xEventGroupClearBits()2. 函数 xEventGroupClearBitsFromISR()3. 函数 xEventGroupSetBits()4. 函数 xEventGroupSetBitsFromISR() 四、获…

Linux pthread线程操作 和 线程同步与互斥操作

在Linux系统中玩线程&#xff0c;使用pthread&#xff0c;这篇博客记录如何创建线程和使用线程和线程的同步与互斥。 还有一份nginx线程池的代码供大家阅读学习&#xff01; 目录 一、简介 什么是线程 线程的优点、缺点 线程的应用场合 二、线程的使用 1. 创建线程 - p…

如何评价聚类结果的好坏?

聚类有效性的评价可分为内部指标和外部指标&#xff0c;内部指标是一种无监督的评价方法&#xff0c;它对聚类结果的评价不需要借助样本集的真实标签&#xff0c;仅利用样本集自身 结构信息对聚类结果进行评价&#xff1b;而外部指标是一种有监督的评价方法&#xff0c;它通过对…

简单毛概刷题网页制作 3.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了&#xff0c;但是一直没有修复。当时眼看着复习时间逐渐被压缩&#xff0c;自己啥也做不了&#xff0c;遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本&#xff08;传送门&#xff09;&#xff0c;功能…

Microsoft office Word 批注相关问题解决

Microsoft office word 批注相关问题解决 目录 Microsoft office word 批注相关问题解决1.增添并显示批注2.批注显示及取消操作3.更改批注者姓名4.将Microsoft office Word文档中已批注的名字以及缩写修改为自己需要的4.1将Microsoft office Word文档中已批注的名字修改为自己需…

STM32开发(十八)STM32F103 片内资源 —— 窗口看门狗 WWDG 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 独立看门狗和窗口看门狗的区别&#xff1a; 独立看门狗在系统在待机、停机、睡眠阶段还会起效果&#xff0c;这就会导致在做低功耗的时候&#xff0c;看门狗还是会…

Elasticsearch:定制 Elasticsearch 镜像

在很多时候&#xff0c;我们希望定制我们的 Elasticsearch 镜像&#xff0c;比如&#xff0c;我们需要安装一些额外的插件&#xff0c;或者如果我们想要一个带有同义词文件和自定义配置的 Elasticsearch&#xff1f;或者我们需要一些相应的配置等。我们想在每次的 docker 部署中…

华为实习笔试复盘(1)配送站和客户问题

写在前面 自己玩了很多项目&#xff0c;但是最近准备秋招的过程中&#xff0c;发现自己对于算法和编程语言的基本功夫实在是太欠缺了。 投递了华为的实习岗位&#xff0c;4.26参加机考&#xff0c;一做题就发现了自己很多地方都不会。这里写下笔试后的复盘以警醒自己。 题目 …

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c;而外部客户端可能需要调用多个服务的接口才能完成一个业务需求&#xff0c;如果让客户端直接与各个微服务通信&#xff0c;会有以下的问题&#xff1a; 破坏了服务无状态…

python毕业设计之django+vue企业员工在线办公OA系统

该系统分用户和管理员。 管理员界面&#xff0c;具有以下功能&#xff1a; &#xff08;1&#xff09;添加用户&#xff1a;管理员添加本系统的用户信息。 &#xff08;2&#xff09;添加部门信息&#xff1a;管理员添加本系统的部门信息。 &#xff08;3&#xff09;添加职位信…

GLM:ChatGLM的基座模型

介绍 ChatGLM-6B&#xff1a;https://github.com/THUDM/ChatGLM-6B &#xff0c;主要是能够让我们基于单卡自己部署。ChatGLM的基座是GLM: General Language Model Pretraining with Autoregressive Blank Infilling论文中提出的模型。 动机 预训练语言吗模型大体可以分为三…

【MySQL约束】数据管理实用指南

1、数据库约束的认识 数据库约束的概念&#xff1a;数据库的约束是关系型数据库的一个重要的功能&#xff0c;它提供了一种“校验数据”合法性的机制&#xff0c;能够保证数据的“完整性”、“准确性”和“正确性” 数据库的约束&#xff1a; not null&#xff1a;不能存储 nul…

最强Http缓存策略之强缓存和协商缓存的详解与应用实例

HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地&#xff0c;以便下次请求时能够直接从缓存中获取资源&#xff0c;从而减少网络请求次数&#xff0c;提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。 一. 强缓存 强缓存是指浏览器直接从本…

javaweb权限管理简单实现_javaweb管理系统项目

最近在做一个网站类型项目&#xff0c;主要负责后台&#xff0c;ui框架选型为jquery easy ui&#xff0c;项目架构为spring mvc spring jdbc&#xff0c;简单易用好上手&#xff01;搭建好框架后开始了第一个任务&#xff0c;设计并实现一套简单的权限管理功能。 一套最基本的…

深度学习第J8周:Inception v1算法实战与解析

目录 一、Inception v1 1.简介 2. 算法结构 二、pytorch代码复现1.前期准备 2.代码复现 3.训练运行 3.2指定图片进行预测 三、总结 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作…

ChatGPT登陆方法及常见问题

Chatgpt现在推出ChatGPT Plus服务&#xff0c;所以对注册账号限制比较大 Plus账号有什么优势&#xff1f; 我们可以看到官方介绍&#xff1a; 优势1 Available even when demand is high 当访问量大时&#xff0c;依旧可以访问 优势2 Faster response speed 更快的回复速度…

无云服务器,Linux本地快速搭建web网站,并内网穿透发布上线

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章&#xff1a;Linux CentOS本地搭建…