浅谈MySQL索引以及执行计划

news2024/11/15 12:44:17

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)

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

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

相关文章

了解MSIL汇编和IL汇编评估堆栈

.assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 1.entrypointldstr "I am from the IL Assembly Language..."call void [mscorlib]System.Console::WriteLine (string)ret} 这是MSIL…

spring-transaction源码分析(2)EnableTransactionManagement注解

概述(Java doc) 该注解开启spring的注解驱动事务管理功能&#xff0c;通常标注在Configuration类上面用于开启命令式事务管理或响应式事务管理。 Configuration EnableTransactionManagement public class AppConfig {Beanpublic FooRepository fooRepository() {// configur…

【Matter】esp-matter环境下的应用实践(程序烧录及串口监视)

文章目录 esp-matter环境下的应用实践前提准备设置环境变量1.ESP-IDF2.ESP-Matter Matter Example编译下载1.激活esp-matter环境2.选择esp设备3.编译工程4.SDK烧写 esp-matter环境下的应用实践 前提准备 请确保你本地已经配置好 esp-idf 及esp-matter环境&#xff0c;可参考此…

经典文献阅读之--PCAccumulation(动态三维场景构建)

0. 简介 多波束激光雷达传感器&#xff0c;常用于自动驾驶汽车和移动机器人&#xff0c;获取三维范围扫描序列&#xff08;“帧”&#xff09;。由于角度扫描分辨率有限和遮挡&#xff0c;每帧只稀疏地覆盖场景。稀疏性限制了下游过程的性能&#xff0c;如语义分割或表面重建。…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…

shared_ptr 的线程安全性

多线程环境下&#xff0c;调用不同的 shared_ptr 实例的成员函数是不需要额外的同步手段的&#xff0c;即使这些 shared_ptr 管理的是相同的对象。 多线程对于同一个 shared_ptr 实例的读操作&#xff08;访问&#xff09;可以保证线程安全&#xff1b;但对于同一个 shared_ptr…

对标世界一流|从Just in time到Just in case ——汽车行业供应链管理经验借鉴

01 丰田汽车精益生产 作为最复杂和最成熟的供应链之一&#xff0c;汽车行业供应链无疑是供应链领域集大成者&#xff0c;而提起汽车行业供应链&#xff0c;就不得不提到丰田汽车&#xff1b;提到丰田汽车&#xff0c;就肯定离不开大名鼎鼎的精益生产以及JIT模式。 JIT模式由丰…

【UE】高级载具插件-05-扫描材质

效果 步骤 1. 首先创建一个材质 再创建一个材质参数集 创建材质实例 2. 将后期处理体积放入场景&#xff0c;并缩放至合适的大小使其全方位覆盖 在后期处理材质中添加一个数组 选择资产引用 将材质实例拖入 3. 打开参数集&#xff0c;添加一个数组元素 设置默认值和参数名 4. …

2023年湖北省中级职称评审申报条件是什么呢?学历不够可以申报吗?

2023年湖北省中级职称评审申报条件是什么呢&#xff1f;学历不够可以申报吗&#xff1f; 1.大专毕业从事本专业技术工作7年以上&#xff1b;助理满足4年。 2.本科毕业从事本专业技术工作5年以上&#xff0c;助理满足4年。 一般来说中专或者高中学历是无法申请中级职称的&…

mobile代码打APK包

1、安装Android SDK Android SDK 下载地址&#xff1a; http://www.androiddevtools.cn/ 下载位置 下载后解压 打开解压文件&#xff0c;点击 SDK Manager.exe 进行安装 安装组件&#xff0c;这要选 Android 8.0.0 或者以上版本 再次安装&#xff0c;发现没什么可以安装了 2…

【Linux】Shell编程之条件语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、条件测试操作作1.文件测试2.整数值比较3.逻辑测试 二、if语句的结构1.单分支结构2.双分支结构3.多分支结构 三、case多分支结构 一、条件测试操作作 test命令 …

Win10蓝屏错误0x0000007b怎么U盘重装系统?

Win10蓝屏错误0x0000007b怎么U盘重装系统&#xff1f;有用户安装好的电脑系统最近总是会出现蓝屏错误0x0000007b的情况&#xff0c;遇到这样的情况很多用户不懂怎么去进行处理。今天分享一个U盘重装系统的方法&#xff0c;教会你快速解决此问题的方法。 准备工作&#xff1a; 1…

体验 nanoGPT

体验 nanoGPT 1. 使用预训练模型2. 训练自己的模型2-1. 准备训练数据2-2. 模型训练2-3. 模型验证 1. 使用预训练模型 在我们尝试训练自己的模型之前&#xff0c;我们先使用其他人训练好的模型&#xff0c;看看如何在自己的环境中运行聊天机器人。 今天我们使用 GPT4ALL 并从 …

正则匹配x.x.x

\d(\.\d){2} 正则规则 \d 表示一个十进制的数字 [0-9] 匹配加号之前的一次或多次 正则中[]、()、{}的区别 [] 匹配组内任意字符 eg&#xff1a;[1,2,3,a-z]能匹配1、2、3、a到z的任意字符 () 相应的匹配字符串&#xff0c;匹配组&#xff0c;子表达式 eg:(abc|cbd)能匹配…

既然有Map了,为什么还要有Redis?

以下内容转自掘金 作者:哪吒编程 同样是缓存&#xff0c;用map不行吗&#xff1f; Redis可以存储几十个G的数据&#xff0c;Map行吗&#xff1f;Redis的缓存可以进行本地持久化&#xff0c;Map行吗&#xff1f;Redis可以作为分布式缓存&#xff0c;Map只能在同一个JVM中进行缓…

2022 Jiangsu Collegiate Programming Contest I. Cutting Suffix

题目链接 Examples input aa Output 1 input ab Output 0 题目大意&#xff1a; 后缀i是字符串从第i个字符开始到最后的字符字串 定义Wi,j是字符串 后缀i和后缀j的公共前缀(LCP)的长度 现在给你一个全集为1-n的互补集T1,T2 要求题目中求和公式的最小值。 题目要点&#xff1a;…

学习笔记(1 - 01)项目初始化的方案和对比

目录 1&#xff0c;创建项目的方式1.1&#xff0c;两种方式创建的项目比对HbuilderX创建的项目&#xff1a;cli创建的项目 1&#xff0c;创建项目的方式 uniapp提供两种方式创建项目&#xff1a; 通过HbuilderX编辑器创建&#xff1a; 通过vue-cli创建 第一方式只能通过Hbuild…

如何在Facebook上创建一个成功的广告账户?

Facebook广告已成为许多企业吸引客户和推广品牌的主要方式。但是&#xff0c;如果你没有经验或知识&#xff0c;创建一个成功的Facebook广告账户可能会变得相当棘手。在这篇文章中&#xff0c;我将向你介绍如何创建一个成功的Facebook广告账户。 第一步&#xff1a;创建Faceboo…

Lucene和Solr和Elasticsearch区别,全文检索引擎工具包Lucene索引流程和搜索流程实操

文章目录 基本概念什么是全文检索技术全文检索的应用场景搜索引擎站内搜索&#xff08;关注&#xff09;文件系统的搜索 Lucene & solr & es介绍区别Solr与Lucene对比ES与Lucene的区别ES与Solr对比 Lucene实现全文检索的流程入门程序需求环境准备数据库脚本初始化Lucen…

ADAS测试方案

一 方案概述 随着5G通讯与互联网的快速发展&#xff0c;智能汽车和ADAS辅助系统的研究与发展在世界范围内也在如火如荼地进行。风丘紧跟时代脚步&#xff0c;经多年积累沉淀&#xff0c;携手整车厂与高校共同研发打造出了一套完整且适用于国内ADAS测试的系统方案。 | ADAS测试…