执行计划的extra字段---- using where , using index 和 using where using index 整理

2024-03-18 09:58

本文主要是介绍执行计划的extra字段---- using where , using index 和 using where using index 整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结论: 

extra字段是using index,意思就是索引覆盖,查询的内容可以直接在索引中拿到

extra字段是using where,代表发生了过滤和索引没有直接关系【和是否会表也没有关系】

CREATE TABLE table (
xxx varchar(20) NOT NULL,
yyy varchar(20) NOT NULL,
zzz datetime NOT NULL,
aaa varchar(10) NOT NULL,
PRIMARY KEY (xxx,yyy,zzz),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

explain select xxx from table
explain select yyy from table
explain select zzz from table
这三个的执行计划,extra字段是using index,意思就是索引覆盖,查询的内容可以直接在索引中拿到。

explain select aaa from table where xxx=’something’
查询内容不在索引内,where条件为索引最左列,extra是using wheretype是ref,表明虽然用到了索引,但是没有索引覆盖,产生了回表。

explain select yyy from table where xxx=’something’
查询内容在索引内,where条件为索引最左列,extra是using where using index,type是ref,表明用到了索引,索引也覆盖了,using where代表发生了过滤,网上有不少文章误把using where和是否读取索引进行关联,是不正确的,请参考此链接:https://segmentfault.com/q/1010000003094577/a-1020000003697411

explain select xxx from table where zzz=’2018-01-19 00:00:00’
查询内容在索引内,where条件为索引第三列,这次不是最左列了,extra依旧是using where using index,但是type变成了index,这表明发生了索引扫描,因为where条件不是最左列的缘故,其性能肯定是差于ref的。

explain select xxx from table where yyy= ‘some’ and zzz=’2018-01-19 00:00:00’
结果同上一条,因为where条件没有最左列

explain select xxx from table where xxx=’something’ and yyy= ‘some’ and zzz=’2018-01-19 00:00:00’
查询内容在索引内,where条件为联合索引的全部列,并且最左列在第一个,extra是using index,type是const,代表引擎根据主键直接取出了唯一的数据,因为是唯一的数据,所以没有using where。可以想像这句sql速度应该是相当快的,联合索引这样用可以发挥最大的功效。

explain select aaa from table where xxx=’something’ and yyy= ‘some’ and zzz=’2018-01-19 00:00:00’
此句和上一句的区别就是查询内容不在索引内,type还是const,但是extra变成了null,理由很简单,因为没有索引覆盖,回表拿数据了。

explain select aaa from table where zzz=’2018-01-19 00:00:00’
explain select aaa from table where yyy=’some’
explain select xxx from table where aaa= ‘any’
这三个的extra都为using where,type是all,代表是全表扫描,既然是全表扫描,那就肯定没using index什么事了,using where说明在全表扫描后发生了过滤。
前两个走全表扫描的原因应该是查询内容不在索引范围内,且where条件没有最左列,所以引擎选择了走全表扫描。
最后一个应该是where条件不是索引,所以走全表扫描。

explain select aaa from table where xxx=’something’
查询内容不在索引内,where条件是索引最左列,extra为using where,type是ref,因为where的索引列是有序的,所以走了ref,又因为查询内容不在索引内,所以没有using index,因为产生了过滤,所以有using where。

这篇关于执行计划的extra字段---- using where , using index 和 using where using index 整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/821984

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文

Python临时计划

时间:6月——9月        入门

BD错误集锦1——[Hive]ERROR StatusLogger No log4j2 configuration file found. Using default configuration:

错误描述:在使用IDEA进行jdbc方式连接到hive数据仓库时,出现以下错误:                ERROR StatusLogger No log4j2 configuration file found. 问题原因:缺少log4j2.xml文件   <?xml version="1.0" encoding="UTF-8"?><Configuration><Appender

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var

android的strings整理脚本

统一对String整理的工具,结构如下 代码 package com.owant.toollib;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.List;import java.util

IPython使用技巧整理

以下是一些常见且有用的IPython使用技巧,整理如下: 一、基本功能 1. 启动IPython:在终端输入`ipython`命令即可启动IPython环境。 2. 自动补全:使用`Tab`键进行变量和函数名的自动补全。例如,输入`pri`后按`Tab`键,会自动补全为`print`。 二、魔法命令(Magic Commands) 1. %timeit:用来计时小段代码的执行时间

Class 对象在执行引擎中的初始化过程

一个 class 文件被加载到内存中需要经过 3 大步:装载、链接、初始化。 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。 链接 链接过程分为 3 步:验证、准备、解析。 验证: 初始化 这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。 1.文件格式检验:检

论文阅读--Efficient Hybrid Zoom using Camera Fusion on Mobile Phones

这是谷歌影像团队 2023 年发表在 Siggraph Asia 上的一篇文章,主要介绍的是利用多摄融合的思路进行变焦。 单反相机因为卓越的硬件性能,可以非常方便的实现光学变焦。不过目前的智能手机,受制于物理空间的限制,还不能做到像单反一样的光学变焦。目前主流的智能手机,都是采用多摄的设计,一般来说一个主摄搭配一个长焦,为了实现主摄与长焦之间的变焦,目前都是采用数字变焦的方式,数字变焦相比于光学