执行计划的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

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern