索引排序以及explain

news2024/11/16 0:41:55

标题

  • explain函数
    • type
    • key
    • extra
    • rows
  • 索引排序

前言,如无特殊提醒,默认建立如下索引。
在这里插入图片描述

explain函数

type

type列反映了访问类型。表示mysql如何找到数据。访问类型有很多种,从全表扫描到索引扫描、范围扫描、唯一索引查询、常数引用等。这里列出的这些,速度从慢到快,扫描的行数从多到少:
all < index<range<req<const,你不需要记住这些访问类型,但需要明白扫描表、扫描索引、范围访问和单值访问的概念。

  • 全表扫描all:顾名思义,就是扫描了整张表。age上没有任何联合或单个索引,id是主键。由于没有索引,所以执行时,去全表过滤age>10的数据。
    在这里插入图片描述

  • 索引扫描index:扫描了一颗B+树,比如聚簇索引、覆盖索引等。
    举例:

    1. 比如select id from dept。id是主键,走的聚簇索引。
    2. 建立联合索引:(db_source, dname, sex),
      select dname from dept where db_source > 10;因为where过滤条件满足索引左前缀,所以是扫描的一颗索引树,而且查询的列是索引类,走的是覆盖索引查询。
      在这里插入图片描述
      而加入一个age列,这样索引树上每查询一次都还要回表一次,type列自然不是index而是all。在这里插入图片描述
  • 范围扫描range:
    在这里插入图片描述
    注意,这里where里面的列,也是需要走索引才行的。
    因为如果没有索引的话,就走了全表扫描了,即all。
    而且这里的条件需要满足最左前缀原则,否则成index,如下:
    在这里插入图片描述

  • 唯一索引查询ref或eq_ref:
    一般是对主键或唯一索引进行等值查询,返回一条或多条数据。
    如图建立普通联合索引(dbsource,dname,sex),在这里插入图片描述

  • 常数const:
    一般是对主键或唯一索引进行等值查询,返回一条数据。我觉得走聚簇索引就是这样。
    在这里插入图片描述

key

key表明了我们用到了哪一个索引。这个“用”,也可能是直接查询,也可能是用来扫描的。

如图,where里面也没有满足最左前缀匹配呀?为什么显示还是走了索引呢?
知乎上讲8.0以后优化了啥的,但我的版本是5.7.33啊。(与数据量无关,我在8w的表里执行,结果一样)
我试着分析一下,
type是index,表示扫描了一颗索引树,而且查询的列都是索引列,应该走的是覆盖索引查询(extra列没截全,可以看下一个图)。所以key显示idx_thress的意思是:我用到了这个索引,因为不满足左前缀,不能精确查询,所以是用来扫描的。
在这里插入图片描述
在这里插入图片描述

当我们再加一个where条件时,type变为了ref,此时key为idx_threes表示:我用到了这个索引进行查询数据(注意这里的查找和上面的扫描是不同的)。由于是等值查询,所以type是ref
在这里插入图片描述

extra

using index:覆盖索引查询
using filesort:用到了文件排序
using where:见下面rows

rows

表示mysql查找结果,大概需要扫描多少行。这个值仅供参考。

一般地,MySQL能够使用如下三种方式应用WHERE条件,从好到坏依次为:
●在索引中使用WHERE条件来过滤不匹配的记录。这是在存储引擎层完成的。
●使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须再回表查询记录。●从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using where)。这在MySQL服务器层完成,MySQL需要先从数据表中读出记录然后过滤。

索引排序

MySQL有两种方式可以生成有序的结果:通过排序操作,或者按索引顺序扫描。如果在EXPLAIN的输出结果中,type列的值为“index”,则说明MySQL使用了索引扫描来做排序(注意,不要和Extra列的“Using index”搞混)。

扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录都回表查询一次对应的记录。这基本上都是随机I/O,这样比顺序地全表扫描都慢。
有两种方式,1.where 条件和order by的字段组合起来满足最左前缀原则
2.order by里面的字段满足最左前缀。下面是两个例子:

排序时要和查询一样,order by中的字段都要满足最左前缀匹配规则 且 排序顺序要一致。如果查询需要联接多张表,则只有当ORDER BY子句引用的字段全部在第一个表中时,才能使用索引做排序。因为排序时字段可能来自多个表,而索引只能在单个表上建立奥。
在这里插入图片描述

另外一种:
ORDER BY子句不满足索引的最左前缀的要求,也可以用于查询排序,这正是因为索引的第一列被指定为了一个常数。
在这里插入图片描述
原文作者:WKP9418
原文地址:https://blog.csdn.net/qq_43179428/article/details/140819862

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

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

相关文章

Oracle <left> join on where 先过滤还是先join

一、left join onon条件是在生成临时表时使用的条件&#xff0c;它不管on中的条件是否为真&#xff0c;都会返回左边表中的记录。 二、left join on and&#xff08;1&#xff09;如果and语句是对左表进行过滤的&#xff0c;那么不管真假都不起任何作用。&#xff08;2&#x…

视频剪辑免费素材哪里能找到?

在创作视频时&#xff0c;素材的选择至关重要。为了让您的项目更具吸引力和专业性&#xff0c;我整理了8个剪辑必备素材网站&#xff0c;它们提供了丰富多样的资源&#xff0c;从高清视频到优质音乐&#xff0c;应有尽有。让我们一起探索这些资源丰富、质量上乘的平台&#xff…

倍思开放式耳机佩戴舒服吗?南卡、倍思、QCY三款热门产品测评!

​放式蓝牙耳机已然成为年轻族群的新风尚&#xff0c;就连不少中老年朋友也偏爱在公园漫步时佩戴它们。这些耳机在娱乐、学习、健身、办公等多元化场景中展现出强大的实用性。作为一名数码博主和耳机狂热粉&#xff0c;我最近一直收到不少小伙伴的私信&#xff0c;想让我测评一…

reaConverter(图片格式转换工具) Pro v7.819 中文授权版

reaConverter是一款图片文件格式转换工具&#xff0c;它支持480多种不同的文件格式。使用reaConverter可以轻松的转换一批图片文件&#xff0c;也可以对其进行编辑和优化。 软件功能&#xff1a; 1. 图片文件格式转换&#xff1a;支持将JPEG、PNG、GIF、TIFF、BMP等格式的图片…

java多线程, 该如何处理异常?

目录 如何处理线程运行时异常 UncaughtExceptionHandler 没有注入 未捕捉异常处理器, 线程是如何处理异常的? 看的时候, 希望自己能在idea中跟着ctrl 鼠标左键, 点一遍. . . 如何处理线程运行时异常 先来了解一下java的异常: 在Java中&#xff0c;异常&#xff08;Excep…

fastjson-流程分析

参考视频&#xff1a;fasfjson反序列化漏洞1-流程分析 分析版本 fastjson1.2.24 JDK 8u65 分析过程 新建Person类 public class Person {private String name;private int age;public Person() {System.out.println("constructor_0");}public Person(String na…

API调度

API调度 什么是API什么是HTTP请求如何使用影刀API流程创建密钥获取token启动应用 如何通过代码调用影刀API下载requests库准备工作搭建框架获取token&#xff08;鉴权&#xff09;转换请求为json调用函数按照键名进行提取 获取应用查询状态结束流程 什么是API 什么是HTTP请求 如…

[极客大挑战 2019]Http1

打开题目 鼠标右键查看源码看看有外部链接 点击氛围&#xff0c;弹出新页面 修改请求头 得到flag 说只读&#xff0c;然后改

Java 反射(reflex)

反射理解 反射解析 Java 的反射机制是指在运行状态中。对于任意一个类&#xff0c;都能知道这个类的属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它的任意一个方法&#xff1b; 这种动态获取信息以及动态调用对象方法的功能称为 java 的反射机制。 正射…

Python .whl 独立安装和全部依赖安装命令

以安装 Flask 为例&#xff1a; 1. 独立安装 pip install whl_files/Flask-1.1.2-py2.py3-none-any.whl 2. 安装 Flask 全部依赖包和自己 cd /path/to/flask/1.0 pip install --no-index --find-links/path/to/downloaded/files Flask1.1.2 cd /path/to/flask/2.0 pip install …

55533

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月20日 最后&#xff1a; 十分感谢你可以耐着性子把它读完和我可以坚持写到这里&#xff0c;送几句话&#xff0c;对你&#xff0c;也对我&#xff1a; 1.一个冷知识&#xff1a; …

mysql数据和备份

mysql备份和恢复和日志管理&#xff08;配置文件当中的设置&#xff09; 备份的目的是什么 备灾 在生产环境中&#xff0c;数据的安全性非常重要 造成数据丢失的原因 1、程序出错 2、人为问题 3、磁盘故障。 备份的分类 物理备份&#xff1a;对磁盘或者文件直接进行备…

敢不敢跟我一起搭建一个Agent!不写一行代码,10分钟搞出你的智能体!纯配置也能真正掌握AI最有潜力的技术?AI圈内人必备技能

说一千道一万&#xff0c;不如实地转一转。学了那么久的AI Agent的概念了&#xff0c;是时候该落地一个Agent看看自己的掌握程度了对不对&#xff0c;我们都理解大脑是自动节能的&#xff0c;但是知识的确需要倒逼自己一把才能真的掌握&#xff0c;不瞒大家说&#xff0c;笔者对…

植物精灵大战僵尸(合体版),一款塔防+合体玩法的游戏

一款塔防合体玩法的游戏&#xff0c;本作在原先经典植物战僵尸玩法的基础上&#xff0c; 完美加入合体进化玩法。完美破解&#xff0c;支持飞行模式&#xff0c; 理论上支持所有运营商&#xff0c;进入付费页面直接点确定或者返回就能完成破解&#xff0c; 移动卡真机测试&a…

Vue3+TypeScript+printjs 实现标签批量打印功能

前言&#xff1a;临时性需求没怎么接触过前端&#xff0c;代码实现有问题及优化点希望大佬可以留言告知一下 开发工具&#xff1a;VS CODE 界面开发&#xff1a;Vue3TypeScriptElementPlus 打印组件&#xff1a;Print-JS 前端打印入口图&#xff1a; 标签页面&#xff1a; …

电气数字化能为企业带来哪些助力?

本文主要从“电气行业概况” 和 “电气数字化核心价值”2个方面&#xff0c;为大家全方位解答“电气数字化能为企业带来哪些助力&#xff1f;” 一、电气行业概况 总体而言&#xff0c;我国电气行业是规模体量巨大的基础产业&#xff0c;目前存在平均效益不高、生产及交易效率…

linux-centos配置jdk环境变量

1、在官网下载适配的jdk到本地后&#xff0c;通过ssh工具将文件上传到 /etc目录下 2、使用命令 vim /etc/profile 在文件末尾加上 #set java environment JAVA_HOME/etc/jdk1.8 JRE_HOME/etc/jdk1.8/jre CLASS_PATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOM…

Codeforces Round 946 (Div. 3) C. Beautiful Triple Pairs (容斥原理)

注意这里的三元组是按顺序找出来的&#xff0c;不能够随便组合。 由于数组长度不算很大&#xff0c;我们可以实现一层循环。 根据题目&#xff0c;我们分别调取对于当前遍历到的三元组&#xff0c;第一个数不同其余数相同&#xff0c;第二个数不同其余数相同&#xff0c;第三个…

运维-6-采用LPG搭建轻量级日志收集系统

参考Grafana 安装配置教程 1 Grafana Grafana是一个通用的可视化工具。对于Grafana而言&#xff0c;Prometheus这类为其提供数据的对象均称为数据源&#xff08;Data Source&#xff09;。目前&#xff0c;Grafana官方提供了对&#xff1a;Graphite, InfluxDB, OpenTSDB, tde…

v-for遍历数据类型方式

第一种&#xff1a;数组 v-for"(item, index) in list" 属性作用item取数组的每一项的对象&#xff1b;index取数组的每一项的下标&#xff1b; html&#xff1a; <div v-for"(item, index) in list" :key"index"><span>名称&…