Mysql Sql 优化之 Explain

news2024/11/25 2:45:10

在开发中,往往遇到一些慢查询语句, 我们需要对慢查询进行优化。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/489404.html

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

相关文章

JavaWeb:JavaScript 教程 笔记

1 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演…

SettingsProvider单编生效

SettingsProvider单编生效 1、单编SettingProvider, make SettingsProvider&#xff0c;会生成apk&#xff0c;apk的路径为&#xff1a; product/qssi/system/priv-app/SettingsProvider/2、将手机恢复出厂设置&#xff0c;在过google向导之前 3、删除SettingProvider对应的…

【Redis】Redis分布式锁的10个坑

文章目录 前言1. 非原子操作&#xff08;setnx expire&#xff09;2.被别的客户端请求覆盖&#xff08; setnx value为过期时间&#xff09;3. 忘记设置过期时间4. 业务处理完&#xff0c;忘记释放锁5. B的锁被A给释放了6. 释放锁时&#xff0c;不是原子性7. 锁过期释放&…

复杂系统层级原理与模型驱动软件体系结构

最近看到模型驱动在国内渐渐被更多的人注意&#xff0c;前几天又看到一些关于UML优劣和应用方面的争论。作为繁忙工作中的一种休息&#xff0c;从过往的研究笔记中整理一点东西放在这里&#xff0c;与大家交流。 层级理论是构建复杂软件体系的基本原则 诺贝尔奖获得者赫伯特 A.…

RocketMQ第三节(生产者和消费者)

目录 1&#xff1a;生产者&#xff08;同步、异步、单向&#xff09; 1.1&#xff1a;同步发送消息&#xff08;每发送一条等待mq返回值&#xff09; 1.2&#xff1a;异步发送消息 1.3&#xff1a;单向发送消息&#xff08;不管成功失败&#xff0c;只管发送消息&#xff09…

学会以下几点,拍出人像大片很简单

很多人拍照&#xff0c;都是用手机拍的&#xff0c;虽然手机的摄影功能并没有相机那么齐全&#xff0c;但我们依然可以借助一些技巧拍出美美的照片&#xff0c;下面是为大家整理出了一份手机拍照指南&#xff0c;拍出人像大片很简单。 1、捕捉光影 光影是拍照的重要元素之一&…

【Unity编辑器】拓展Inspector视图

目录 1、拓展源生组件 2、拓展继承组件 3、组件不可编辑 4、Context菜单 1、拓展源生组件 摄像机就是典型的源生组件。它的局限性就是拓展组件只能加在源生组件的最上面或者最下面&#xff0c;不能插在中间&#xff0c;不过这样也就够了 using UnityEngine; using UnityEd…

接口测试之Jmeter+Ant+Jenkins接口自动化测试平台

目录 平台简介 环境准备 Jenkins简介 下载与安装 平台搭建 依赖文件配置 build.xml配置 Ant构建 阿里大佬倾情演绎&#xff0c;3天让你学会Jmeter接口测试&#xff0c;学不会算我输_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q84y1K7bK/?spm_id_from333.99…

如何设置渗透测试实验室

导语&#xff1a;在本文中&#xff0c;我将介绍设置渗透实验室的最快方法。在开始下载和安装之前&#xff0c;必须确保你使用的计算机符合某些渗透测试的要求&#xff0c;这可以确保你可以一次运行多个虚拟机而不会出现任何问题。 在本文中&#xff0c;我将介绍设置渗透实验室的…

Python | 人脸识别系统 — 用户操作

本博客为人脸识别系统的摄像头画面展示代码解释 人脸识别系统博客汇总&#xff1a;人脸识别系统-博客索引 项目GitHub地址&#xff1a; 注意&#xff1a;阅读本博客前请先参考以下博客 工具安装、环境配置&#xff1a;人脸识别系统-简介 UI界面设计&#xff1a;人脸识别系统-UI…

错题汇总03

1.以下对二维数组a进行正确初始化的语句是 A int a[2][]{{0,1,2},{3,4,5}} B int a[][3]{{0,1,2},{3,4,5}} C int a[2][4]{{0,1,2},{3,4},{5}}; D int a[][3]{{0,,2},{},{3,4,5}} A数组列不能省略 C数组越界 D数组初始化每一行必须连续初始化 2.能把函数处理结果的二个数据…

msvcr110.dll丢失的解决方法-计算机中丢失msvcr110.dll怎么办?

看到您遇到了msvcr110.dll丢失的问题&#xff0c;这是由于您的计算机缺少必要的系统文件导致的。为了解决这个问题&#xff0c;您可以尝试以下几个步骤方法&#xff1a;就可以轻松解决msvcr110.dll丢失的问题。 msvcr110.dll修复方法一 重新安装Microsoft Visual C msvcr110.d…

windows安装node.js和vue3.x

目录 下载并安装node配置环境变量配置淘宝镜像源安装webpack全局打包工具安装cnpm安装vue-cli 3.xcnpm问题警告的解决办法 下载并安装node 1&#xff0c;下载nodejs 直接从node.js官网下载&#xff1a;https://nodejs.org/en/download 根据自己电脑的版本选择32位或者64位&…

建筑诊断用热像仪应用-flir T530红外热成像仪

建筑诊断用热像仪应用-flir T530红外热成像仪 建筑诊断领域热成像技术 隔热性能不良或隔热性能不足、潮气、建筑物外表面裂缝及不达标工程往往使住宅用建筑及商用建筑业主蒙受巨大的 经济损失。而红外热像仪却能够帮助您快速察觉有待改进的能效问题 建筑诊断用热像仪应用|带电…

两分钟成为 ChatGPT 国内高手【不要再拿ChatGPT当百度用了】

不要再问ChatGPT那些问百度的问题了&#xff0c;有更进阶的用法 更高效的编写prompts&#xff0c;以便ChatGPT给出更精准的回答 但是需要注意的是&#xff1a;国内现在根本没有GPT-4使用&#xff0c;但凡是说有GPT-4的都是骗子。 GPT 可以写文章&#xff0c;可以写诗&#x…

全方位揭秘!大数据从0到1的完美落地之运行流程和分片机制

一个完整的MapReduce程序在分布式运行时有三类实例进程&#xff1a; MRAppMaster: 负责整个程序的过程调度及状态协调MapTask: 负责Map阶段的整个数据处理流程ReduceTask: 负责Reduce阶段的整个数据处理流程 当一个作业提交后(mr程序启动)&#xff0c;大概流程如下&#xff1…

TouchGFX开发(2)----触摸屏幕组件点亮LED

TouchGFX开发.1----安装软件 概述创建 TouchGFX 项目添加图片组件添加按钮interactions 设置生成代码打开文件配置LED触摸点亮LED演示效果 概述 了解如何使用 TouchGFX 配置屏幕&#xff0c;添加触摸按钮&#xff0c;并通过按钮控制板载 LED 的状态。 创建 TouchGFX 项目 打…

详解map、set、multimap、multiset的使用

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 目录 前言set、multiset的使用1. set2. multiset3. 什么时候应该使用multiset而不是set map、multimap的使用1.map2.multimap3.什么时候应该使用multimap而不是map 前言 map、set、multimap、multiset是C STL中的四…

如何把握未来增长话语权,全链路数字化运营有解

近年来&#xff0c;良品铺子、元气森林、蔚来等迅速成为市场中现象级的品牌&#xff0c;它们往往在很短时间内就发展成市场的生力军和消费者青睐的对象。 仔细研究背后&#xff0c;这些新生品牌的崛起&#xff0c;核心商业逻辑跟以往品牌大为不同&#xff0c;明显更“懂”新生…

基于微信小程序的酒店预定管理系统设计与实现

第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…