当前位置: 首页 > news >正文

浅谈MySQL索引以及执行计划

MySQL索引及执行计划

  • 🐪索引的作用
  • 🐫索引的分类(算法)
  • 🦙BTREE索引算法演变
  • 🦒Btree索引功能上的分类
      • 4.1 辅助索引
      • 4.2 聚集索引
      • 4.3 辅助索引和聚集索引的区别
  • 🐘辅助索引分类
  • 🦏索引树高度
  • 🐭索引的命令操作
      • 查询索引情况
          • 1.方法一
          • 2.方法二
  • 🐿️执行计划分析
            • (1) table 表名
            • (2) type 查询的类型
            • (3) possible_keys :可能会用到的索引
            • (4) key :真正用到的索引
            • (5) key_len : 索引的覆盖长度
            • (6) Extra
  • 🐨关于索引应用的规范
      • 建立索引的原则
      • 不走索引的情况

🐪索引的作用

类似一本书的目录,起优化查询作用

🐫索引的分类(算法)

  1. B树 默认使用的索引类型
  2. R树
  3. Hash
  4. FullText
  5. GIS索引(MongoDB 谷歌 百度地图等)

🦙BTREE索引算法演变

在这里插入图片描述

B-Tree 只有根节点、枝节点和叶子节点
B+Tree 在B-Tree基础上增加了data(粉色部分)双向指针
B*Tree 在B+Tree基础上增加了各枝节点间的双向指针

🦒Btree索引功能上的分类

4.1 辅助索引

(1) 提取索引列的所有值,进行排序
(2) 将排好序的值,均匀的存放在叶子节点,进一步生成枝节点和根节点
(3) 在叶子节点中的值,都会对应存储主键ID

4.2 聚集索引

(1) MySQL会自动选择主键作为聚集索引列,没有主键会选择唯一键,如果都没有会生成隐藏的键
(2) MySQL进行存储数据时,会按照聚集索引列值得顺序,有序的存储数据行
(3) 聚集索引直接将原表数据页,作为叶子节点,然后提取聚集索引列向上生成枝和根

4.3 辅助索引和聚集索引的区别

(1) 表中任何一个列都可以创建辅助索引列(索引名字不能重复)
(2) 在一张表中,聚集索引只能有一个,一般是主键(没有主键则选择唯一键,没有唯一键则会在底层默认生成一个)
(3) 辅助索引,叶子节点只存储索引列的有序值+聚集索引列值
(4) 聚集索引,叶子节点存储的是有序的整行数据
(5) MySQL 的表数据存储时聚集索引组织表

🐘辅助索引分类

单列辅助索引
联合索引(覆盖索引)
唯一索引

🦏索引树高度

索引树高度越低越好,一般维持在3-4行
数据行数较多优化:
分表
分片(也叫分库分表或分布式架构)
字段长度较长优化:
业务允许,尽量选择字符长度短的列作为索引列
业务不允许,采用前缀索引
数据类型影响优化:
char 和 varchar
enum

🐭索引的命令操作

查询索引情况

1.方法一
desc addess; 

在这里插入图片描述
key 表示的是索引键
PRI ===> 主键索引
MUL ===> 辅助索引
UNI ===> 唯一索引

2.方法二
show index from addess; 

在这里插入图片描述

-- 创建单列辅助索引
alter table addess add index idx_name_cs(address);
-- 创建多列辅助索引
alter table addess add index idx_i_a(id,address);
-- 创建唯一索引(假如address列是唯一的)
alter table addess add unique index uidx_add(address);
-- 注意:若该列不是唯一的则会报错
-- 创建前缀索引(前缀索引只能在 字符串 列创建)
alter table addess add index idx_add(address(6));  -- 取address字段前6个字段作为索引

删除索引

-- 1.先查看表的所有索引名
show index from addess;  -- 找到 Key_name列
-- 2.删除
alter table addess drop index idx_name_cs;

🐿️执行计划分析

作用:将优化器 选择后执行计划截取出来,便于管理,判断语句的执行效率
获取执行计划:
desc SQL语句
explain SQL语句
例子:

desc select * from faagent where AgentCode = 'E100000999999';

在这里插入图片描述

(1) table 表名
(2) type 查询的类型

①全表扫描 :ALL
②索引扫描 :INDEX,RANGE,REF,EQ_REF,CONST(或SYSTEM),NULL 性能从左到右依次变好

INDEX:全索引扫描
例子:

desc select AgentCode from faagent;

在这里插入图片描述

RANGE: 索引范围扫描 (> < >= <= between and or in like 等)
例子: mysql> desc select * from faagent where AgentCode > ‘1’;
在这里插入图片描述

REF:辅助索引等值查询
例子: 用 union all 代替 or
EQ_REF: 多表连接时,子表(除了from后的所有表)使用主键列或唯一键列作为链接条件时
例子:left join b b.xx xx为主键或唯一键
CONST(或SYSTEM):主键或唯一键的等值查询
例子:

 desc select * from faagent where AgentCode = 'E101010106999';

在这里插入图片描述

NULL:表示没有查询到所需要的数据,返回的都是null
注意:
对于辅助索引来讲, != 或<> ,not in ,like ‘%xx’ 等语句是不走索引的
对于主键列(主键索引可以,唯一键索引不行)来讲, != 或<> ,not in 等语句是走 RANGE 的
意外情况:将表中所有列建立联合索引,没有个列做查询条件都会走索引

(3) possible_keys :可能会用到的索引
(4) key :真正用到的索引
(5) key_len : 索引的覆盖长度

– 前提 utf8md4 (md4表示一个字符占四个字节长度,utf8表示一个字符占三个字节长度,表想从utf8md4变成utf8 执行以下命令 : alter table表名 charset utf8; 建完之后需要重建索引)
int(10…):最大是4个长度
char(2):最大是24+1=9个长度 其中1是存了一个是否是空的判断字节(若该字段是唯一键则长度为8)
varchar(2):最大是2
4+1+2=11个长度 其中1是存了一个是否是空的判断字节,2是开始和结束都会有一个空的字节
①varchar(20):能存20个任意字节
②varchar(20):不管存储的是字符,数字,还是中文,都是1个字符最大预留长度是4个字节
③varchar(20):对于中文,1个占4个字节,对于数字,1个实际占用1个字节
单列索引越小越好
联合索引覆盖的越大越好

联合索引 add index idx(a,b,c,d)
规范:唯一值多的放到最左侧
1.只要我们将来的查询,所有索引列都是<等值>查询条件下,无关排列顺序(跟mysql版本有关,之前版本要按照建索引的顺序查询才能走索引。最新版本可以无序,mysql会自动排序)
例如: acdb 、badc、cdab、dacb等
原因:优化器,会自动做查询条件的排列
2.不连续部分条件
cad —> 自动排序后: acd ----> 走 a :可以优化:单独建索引 add index idx_cad(c,a,d)
dba —> 自动排序后: abd ----> 走 ab :可以优化:单独建索引 add index idx_dba(d,b,a)
3.在where查询中如果出现 > < >= <= like 则索引只会走到该符号处
例如:select * from table where a=1 and b>2 and c=3 and d = 4;
这里索引只会到 ab
这里若想优化 分两步 ①新建索引(原来的索引需要删除) 顺序为 add index idx(a,c,d,b) ②修改语句:select * from table where a=1 and c=3 and d = 4 and b>2 ;
4.多子句查询,应用联合索引
例如 :select * from test where a = 1 order by b;
应建索引 :alter table test add index idx2(a,b);

(6) Extra

出现 Using filesotr 说明在查询中有关排序的条件没有合理的引用索引
相关的排序语句有 : distinct 、 order by 、group by 、union
关注 key_len 应用的长度

🐨关于索引应用的规范

建立索引的原则

  • 必须要有主键,如果没有可以作为主键条件的列,创建无关列
  • 经常作为where条件列 order by 、group by 、join on 、distinct的条件
  • 最好使用唯一键值多的列作为联合索引的前导列
  • 列值长度较长的索引列,我们建议使用前缀索引
  • 降低索引条目,一方面不要创建没有用的索引,不常使用的索引清理,percona toolkit(xxxxx) pt-duplicate-key-checker
    表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要了,数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。
  • 索引维护要避开业务繁忙期 (mysql_8.0版本之后可以把索引制成隐藏或可用状态,无须再删除)
  • 小表不建索引

不走索引的情况

  • 没有查询条件,或者查询条件没有建立索引
  • 查询结果集是原表中的大部分数据,应该是25%以上
  • 索引本身失效,统计数据不真实
    例子:同一个语句突然变慢(统计信息过旧导致索引失效)
  • 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+ - * / ! 等)
  • 隐式转换导致索引失效
  • <> 、not in 不走索引(辅助索引)
  • like ‘%aa’ 百分号在前边不走索引
  • 联合索引
  • 建立索引时,将等值查询条件往前放,不等值的往后放。
    a = xxx and b > xxx and c = xxx ===> idx(a,c,b)
  • 多子句时:
    where c xxx order by a,b; ====>idx(c,a,b)

相关文章:

浅谈MySQL索引以及执行计划

MySQL索引及执行计划 &#x1f42a;索引的作用&#x1f42b;索引的分类&#xff08;算法&#xff09;&#x1f999;BTREE索引算法演变&#x1f992;Btree索引功能上的分类4.1 辅助索引4.2 聚集索引4.3 辅助索引和聚集索引的区别 &#x1f418;辅助索引分类&#x1f98f;索引树高…...

在c++项目中使用rapidjson(有具体的步骤,十分详细) windows10系统

具体的步骤&#xff1a; 先下载rapidjson的依赖包 方式1&#xff1a;直接使用git去下载 地址&#xff1a;git clone https://github.com/miloyip/rapidjson.git 方式2&#xff1a;下载我上传的依赖包 将依赖包引入到项目中 1 将解压后的文件放在你c项目中 2 将rapidjson文…...

编译方式汇总:Makefile\configure\autogen.sh\configure.ac、Makefile.am文件

一、前言 文章目的&#xff1a;针对各种开源项目&#xff0c;由于部分项目文档写的不够详细&#xff0c;&#xff08;或者是我太菜了&#xff09;&#xff0c;没有进行详细的介绍怎么编译该项目&#xff0c;导致花费过多时间在查找如何编译该项目上。因此该篇文章针对目前遇到的…...

explicit关键字

explicit关键字只能用来修饰构造函数。使用explicit可以禁止编译器自动调用拷贝初始化&#xff0c;还可以禁止编译器对拷贝函数的参数进行隐式转换。 那么什么是隐式转换呢&#xff1f; 类 命名 参数&#xff1b; //有参构造类 命名 命名对象&#xff1b; //拷贝构造&#x…...

[优雅的面试] 你了解python的对象吗

前情提要&#xff1a;小编面试&#xff0c;结果面试官着急去吃饭~又约了这次来面&#xff0c;不晓得又会问什么问题呢&#xff1f; 面试官大佬&#xff1a;小伙子来的挺准时的(赞赏的表情~)&#xff0c;今天咱们接着聊哈&#xff0c;小伙子&#xff0c;你有对象了没&#xff1f…...

【hello Linux】线程概念

目录 1. 线程概念的铺设 2. Linux线程概念 2.1 什么是线程 2.2 线程的优点 2.3 线程的缺点 2.4 线程异常 2.5 线程用途 3. Linux进程VS线程 4. Linux线程控制 4.1 POSIX线程库 4.2 创建线程 4.3 进程ID和线程ID 4.4 线程终止 4.5 线程等待 4.6 分离线程 Linux&#x1f337; 1…...

JavaWeb07(MVC应用01[家居商城]连接数据库)

目录 一.什么是MVC设计模式&#xff1f; 1.2 MVC设计模式有什么优点&#xff1f; 二.MVC运用&#xff08;家居商城&#xff09; 2.1 实现登录 2.2 绑定轮播【随机三个商品】 2.2.1 效果预览 index.jsp 2.3 绑定最新上架&热门家居 2.3.1 效果预览 2.3.2 代码实现 数据…...

如何使用电商API接口API接口如何应用

使用API接口 API&#xff08;应用程序接口&#xff09;是现代软件开发中必不可少的一部分&#xff0c;它通常允许软件与其他软件或服务进行交互。使用API可以大大提高软件的灵活性和可扩展性&#xff0c;并允许您轻松添加新的功能和服务&#xff0c;因此&#xff0c;API接口的…...

【移动端网页布局】流式布局案例 ⑥ ( 多排按钮导航栏 | 设置浮动及宽度 | 设置图片样式 | 设置文本 )

文章目录 一、多排按钮导航栏样式及核心要点1、实现效果2、总体布局设计3、设置浮动及宽度4、设置图片样式5、设置文本 二、完整代码实例1、HTML 标签结构2、CSS 样式3、展示效果 一、多排按钮导航栏样式及核心要点 1、实现效果 要实现下面的导航栏效果 ; 2、总体布局设计 该导…...

1. 先从云计算讲起

本章讲解知识点 什么是云计算&#xff1f; 为什么要用云计算&#xff1f; 物理服务器与云服务器对比 云计算服务类型 云计算部署类型 1. 什么是云计算&#xff1f; 云计算是一种通过计算机网络以服务的方式提供动态可伸缩的虚拟化资源的计算模式。按照服务层次分为IaaS、…...

ZooKeeper安装与配置集群

简介: ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;它提供了一个分布式环境中的高可用性、高性能、有序访问的数据存储&#xff0c;可以让分布式应用程…...

浅谈Mysql的RR和RC隔离级别的主要区别

MySQL默认为RR级别 首先默认RR是因为mysql为了保证在主从同步过程中数据的安全的问题&#xff08;涉及到binlog三种格式&#xff09;。 就是说两个并发事务数AB&#xff0c;A先开启事物最后提交也是最后&#xff0c;事务B开启和提交都在A内部&#xff0c;由于隔离级别不同&…...

Build生成器模式

设计模式简述 设计模式的核心在于提供了相关问题的解决方案&#xff0c;使得人们可以更加简单方便地复用成功的设计和体系结构。 生成器模式&#xff08;创建型设计模式&#xff09; 意图&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以…...

C++程序设计——常见C++11新特性

一、列表初始化 1.C98中{}的初始化问题 在C98中&#xff0c;允许使用花括号{}对数组元素进行统一的列表初始化值设定&#xff0c;比如&#xff1a; 但是对于一些自定义类型&#xff0c;就无法使用这样的方式进行初始化了&#xff0c;比如&#xff1a; 就无法通过编译&#xff…...

Rust main 函数返回值类型不能是 String

是的&#xff0c;Rust 的 main 函数返回值类型不能是 String。 Rust 的 main 函数只能返回以下几种类型之一&#xff1a; ()&#xff1a;表示空类型&#xff0c;不返回任何值。i32&#xff1a;表示程序的退出码&#xff0c;通常非零值表示执行失败&#xff0c;0 表示执行成功…...

视频里的音乐怎么转换成mp3格式?

视频里的音乐怎么转换成mp3格式&#xff1f;视频里的音乐转换为mp3的原因有很多&#xff0c;主要是因为mp3格式是一种音频格式&#xff0c;文件大小较小&#xff0c;更易于存储和传输。相比之下&#xff0c;视频格式则是一种视频文件格式&#xff0c;虽然包含音频&#xff0c;但…...

CSS3 grid网格布局

文章目录 CSS3 grid网格布局概述grid属性说明使用grid-template-rows & grid-template-columns 定义行高和列宽grid-auto-flow 定义项目的排列顺序grid-auto-rows & grid-auto-columns 定义多余网格的行高和列宽row-gap & column-gap 设置行间距和列间距gap 简写形…...

SPSS如何进行均值比较和T检验之案例实训?

文章目录 0.引言1.均值过程2.单样本T检验3.独立样本T检验4.成对样本T检验 0.引言 因科研等多场景需要进行数据统计分析&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对均值…...

Packet Tracer - 配置交换机端口安全

Packet Tracer - 配置交换机端口安全 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 10.10.10.2 255.255.255.0 PC1 NIC 10.10.10.10 255.255.255.0 PC2 NIC 10.10.10.11 255.255.255.0 非法笔记本电脑 NIC 10.10.10.12 255.255.255.0 目标 第 1 部…...

一图看懂 aiohttp 模块:基于 asyncio 的异步HTTP网络库, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 aiohttp 模块&#xff1a;基于 asyncio 的异步HTTP网络库, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图类关系图模块全展开【aiohttp】统计常量模块1 aiohttp.hd…...

Linux + 香橙派 + V4L2 + http 实现远程监控摄像头在网页端显示

项目场景&#xff1a; 项目需求&#xff0c;需要做一个基于边缘端的人脸识别远程监控摄像头并在网页前端展示 &#xff0c;这里采用国产香橙派作为边缘计算终端&#xff0c;安装ubuntu系统&#xff0c;系统中采用v4l2接口对摄像头进行获取&#xff0c;当客户端通过网页进行请求…...

《编码——隐匿在计算机软硬件背后的语言》精炼——第15-16章(十六进制,RAM)

“学习如春起之苗&#xff0c;不见其增&#xff0c;日有所长。” —— 宋代朱熹 文章目录 十六进制十六进制概述十六进制表字节到十六进制 存储器特定的读功能特定的写功能RAM大型RAM阵列 十六进制 十六进制概述 十六进制是一种适用于计算机的进制法。在十进制中&#xff0c;…...

leetcode.1376 通知所有员工所需的时间 - bfs/dfs + 树

1376. 通知所有员工所需的时间 目录 一、bfs 二、dfs 题目&#xff1a; 公司里有 n 名员工&#xff0c;每个员工的 ID 都是独一无二的&#xff0c;编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。在 manager 数组中&#xff0c;每个员工都有一个直属负责人&#x…...

AtCoder Beginner Contest 300——A-G题讲解

蒟蒻来讲题&#xff0c;还望大家喜。若哪有问题&#xff0c;大家尽可提&#xff01; Hello, 大家好哇&#xff01;本初中生蒟蒻讲解一下AtCoder Beginner Contest 300这场比赛的A-G题&#xff01; A - N-choice question 原题 Problem Statement Given integers A A A and…...

Go:值与指针

1. 计算机中的值 在百万年的演化历史中&#xff0c;人类对事物的属性进行了抽象&#xff0c;有了数量、精度、信息等概念的表示&#xff0c;对应的我们称之为整数、小数、文本文字等。计算机出现后&#xff0c;我们使用计算机对真实世界的问题进行建模&#xff0c;通过计算机的…...

【Linux】进程学习(2)---理解进程操作

文章目录 查看进程通过系统目录查看通过ps命令查看 通过系统调用获取进程标识符通过系统调用创建进程初识fork函数fork函数的返回值 进程状态阻塞与运行状态Linux内核源码中的进程状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X 查看进程 通过系统…...

基于springcloud实现的医院信息系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 医疗信息就诊系统&#xff0c;系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成&#xff0c;并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以…...

设计模式-创建型模式-(工厂、简单工厂、抽象工厂)

一、简单工厂模式 上代码 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…...

JAVA12新特性

JAVA12新特性 概述 2019年3月19日,java12正式发布了,总共有8个新的JEP(JDK Enhancement Proposals) JDK 12 is the open-source reference implementation of version 12 of the Java SE12 Platform as specified by by JSR 386 in the Java Community Process. JDK 12 reac…...

Nginx 静态文件、反向代理、负载均衡、缓存、SSL/TLS 加密、gzip 压缩 等等

Nginx的功能 1. 静态文件服务器2. 反向代理服务器3. 负载均衡4. 缓存5. SSL/TLS 加密6. URL 重写7. HTTP/28. WebSocket9. 反向代理缓存10. 安全限制11. gzip 压缩12. 请求限速13. 日志记录14. SSL 证书续订 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器&#xff0c;它…...

wordpress facebook login/谷歌外链工具

两个节点&#xff0c;都可以更新数据&#xff0c;并且互为主从&#xff0c;容易产生的问题&#xff1a;数据不一致&#xff1b;因此慎用&#xff0c;考虑要点&#xff1a;自动增长id&#xff0c;配置一个节点使用奇数id 主主复制的配置步骤&#xff1a; (1) 各节点使用一个惟一…...

B2C网站建设多少钱/网络营销策略分析报告

一、引言 二、inode 和 block 概述 三、inode ------>inode的大小 ------>inode号码 ------>目录文件 ------>inode的使用 一、引言 之前简单介绍了一下linux中的文件系统,这章来分析一下inode相关的东西 二、inode 和 block 概述 文件是存储在硬盘上的…...

帮朋友做网站不给钱/百度搜索推广多少钱

路由器的基本配置 路由器是网络异种网络互联与多个子网互联的重要设备。简单来说&#xff0c;路由器可以将不同的局域网进行互联和通信。 路由器疑点 相比大家都路由器设备并不陌生&#xff0c;日常生活随处可见。 明明处于三层的路由器设备为何运用会比交换机普遍呢&#xf…...

杭州网站建设设计制作/关键词百度指数查询

被tkj大爷艹爆了5555整套模拟赛都是神仙思路题 那么这题题解 还有一个神仙做法&#xff0c;zory巨神在考场上找规律AC&#xff0c;自己都不会证。。我证明了一下(然而这货还是不认可自己的做法) 按照分割点的思路&#xff0c;我们for循环一次&#xff0c;每次找到比当前点小且最…...

wordpress写书typecho主题/推广普通话的意义

collection   定义命名元祖,让元祖的每个元素可以通过类似对象属性的方法用".属性"及其方便的取值.  定义可前后拿取值且可迭代的双端队列  定义有顺序的字典  定义有默认值的字典ps:  队列 &#xff1a;先进先出  堆栈 &#xff1a;先进后出具体用到的或…...

批发网站建设/合肥做网络推广的公司

三星发布Galaxy Note 10.1平板之前曾经推出过一款采用5.3英寸屏幕的Galaxy Note手机&#xff0c;现在它的升级版采用5.5英寸屏幕的Galaxy Note 2也已经问世有几个月的时间了&#xff0c;那么自从Galaxy Note这条产品线诞生之日起它就超越了自家的Galaxy S系列手机产品线&#x…...