【MySQL】第九弹——索引(下)

文章目录

  • 🌏索引(上)回顾
  • 🌏使用索引
    • 🪐自动创建索引
    • 🪐手动创建索引
      • 🚀主键索引
      • 🚀普通索引
      • 🚀唯一索引
      • 🚀复合索引
    • 🪐查看索引
    • 🪐删除索引
      • 🚀删除主键索引
      • 🚀删除其他索引
  • 🌏查看执行计划

🌏索引(上)回顾

  1. MySQL选择使用B+树这种数据结构进行索引

可以有效的控制树高
非叶子节点仅具有索引功能,叶子结点保存真实数据
所有叶子结点构成一个有序链表 实现范围查找

  1. B+树与B树对比

叶子结点中的数据连续,相互连接,便于区间查找和搜索
非叶子结点的值都包含在叶子结点中
树高相同的情况下,查找任一元素时间复杂度都一样,性能均衡

  1. 页是内存与磁盘交互的最小单元,默认大小为16KB

读取数据时,不是单单读取一条数据,而是读取一整页查遍历到相应的数据行
空间不够了 InooDB会提前申请好一页的空间,所以页的磁盘空间是连续的,便于数据的遍历

  1. B+树在MySQL索引中的应用
    在这里插入图片描述

比如查找id 为 6的数据行

现在遍历槽1 通过槽拿到主键值进行判断, 能看到图中槽1的主键值是4 5 > 4 就到槽2中遍历
槽2 中存在主键值为6 的值
先比对槽中记录的主键值,定位到最后⼀个槽2,再从最后⼀个槽中的第⼀条记录遍历,第⼆条记录就是我们要查询的目标行

想要查询页里面的内容,先将页加载到内存,根节点一页,二级节点一页,叶子结点的数据页也是一页,所以说通过三次IO就可以把我们想要的数据找到 --三层树高的B+树

  1. 三层树高的B+树可以存多少记录

一个数据页默认为16KB。假设一条数据为1KB,一页中至多可以存16条数据
索引页中存的是主键值和子节点的引用,也就是说下一个节点的偏移(地址)
主键 bigint类型 占8Byte 下一页地址 6Byte 也就是说一条索引记录占 8 + 6 = 14Byte
一个索引页可以存 16 * 1024 / 14 = 1170
理论上一个三层树高的B+树可以存:1170 * 1170 * 16 = 21,902,400 条记录
在当前的场景下,表中有21,902,400条记录的情况下,通过3次IO就可以完成数据的查询

  1. 索引分类

创建索引之前考虑需不需要创建索引,创建一个索引就会生成一个索引树占磁盘空间,对数据的增删改效率影响较大
如果某一列的重复度过高,像是gender 这种只有两个值的列 数据一多,重复度就会很高,就非常不适合创建索引来提高查询效率
如果要存储文档类的数据,我们会专门使用文档类的数据库,全文索引用的并不多

🌏使用索引

🪐自动创建索引

  • 当我们为一张表加主键约束(PRIMARY KEY),外键约束(FOREIGN KEY),唯一约束(UNIQUE)时,MySQL会为对应的列自动创建一个索引
  • 如果表中不指定任何约束,MySQL会自动为每一列生成一个索引并用ROW_ID字段进行标识

🪐手动创建索引

🚀主键索引

  1. 方式一:创建表时指定主键

在这里插入图片描述

-- 创建表的时候指定主键
create table t_pk1(id bigint PRIMARY KEY auto_increment,name varchar(20)
);
desc t_pk1;
  1. 创建表时单独指定主键列
    在这里插入图片描述
-- 创建表时单独指定主键列
create table t_pk2(id bigint auto_increment,name varchar(20),PRIMARY KEY (id)
);
show index from t_pk2;
  1. 方式三:修改表中的列为主键索引

修改表结构和列语法:

alter table 表名 [add | modify | drop] 要修改的内容

在这里插入图片描述

🚀普通索引

创建的时机:
1.创建表的时候,明确的知道某些列需要频繁查询,就创建好
(当表中数据过少时,全表扫描效率可能比索引还高)
2.随着业务的不断发展,在版本迭代的过程中会添加索引

1.方式一:创建表时指定索引列

在这里插入图片描述

create table t_index1(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20),index (sno)
);desc t_index1;
或者使用show keys from 表名

查看关系
在这里插入图片描述
2. 方式二:修改表中的列为普通索引列
在这里插入图片描述

create table t_index2(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20)
);
alter  table t_index2 add index (sno);
desc t_index2;
  1. 方式三:单独创建索引并指定索引名
    在这里插入图片描述
create table t_index3(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20)
);create index idx_t_index3_sno on t_index3 (sno); 
desc t_index3;
show keys from t_index3;

🚀唯一索引

  1. 方式一:创建表时指定索引列
create table t_test_index (id bigint primary key auto_increment,name varchar(20) uniquesno varchar(10),index(sno)
);
  1. 方式二:修改表中的列为普通索引
create table t_test_index1 (id bigint primary key auto_increment,name varchar(20),sno varchar(10)
);
alter table t_test_index1 add index (sno) ;
  1. 方式三:单独创建索引并指定索引名
create table t_test_index2 (id bigint primary key auto_increment,name varchar(20),sno varchar(10)
);
create index index_name on t_test_index2(sno);

使用create index 创建索引

在这里插入图片描述

🚀复合索引

索引中包含多个列
创建语法和创建普通索引的方式相同,只不过指定多个列,列与列之间用逗号隔开

  1. 方式一:创建表时指定索引列
    在这里插入图片描述
create table t_index4(id bigint PRIMARY KEY auto_increment,name varchar(20),sno varchar(20),class_id bigint,index(sno,name)
);
  1. 方式二:修改表中的列为复合索引
    在这里插入图片描述
create table t_index5 (id bigint primary key auto_increment,name varchar(20),sno varchar(10),class_id bigint
);
alter table t_index5 add index (sno, class_id);
  1. 方式三:单独创建索引并指定索引名
    在这里插入图片描述
create table t_index6 (id bigint primary key auto_increment,name varchar(20),sno varchar(10),class_id bigint
);
create index id_t_index6_sno_name on t_index6 (sno,name);

🪐查看索引

  1. 方式一:show keys from 表名\G;
    在这里插入图片描述

  2. 方式二: show index from 表名;
    在这里插入图片描述

  3. 方式三:简要信息 desc 表名;
    在这里插入图片描述

🪐删除索引

🚀删除主键索引

语法:

alter table 表名 drop  primary key ;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🚀删除其他索引

语法:

alter table 表名 drop index 索引名;

在这里插入图片描述

🌏查看执行计划

怎么查看自己写的SQL走没走索引?
–查看执行计划

  • 先为学生表创建一个索引(复合索引)

在这里插入图片描述

  • 1.不加条件,查询所有(全表扫描)
    在这里插入图片描述
  • 2.使用主键查询
    在这里插入图片描述
    1. 子查询中使用索引
      在这里插入图片描述

type类型:
在这里插入图片描述

  • 4.使用普通索引
    在这里插入图片描述

  • 5.使用复合索引

回表查询
在这里插入图片描述

索引覆盖
在这里插入图片描述
在这里插入图片描述

Extra: 执行情况的说明和描述,包含不适合在其他列中显示但十分重要的额外信息。
1.Using index: 表示使用索引,如果只有Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引
2.Using where: 表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现Using where。

在这里插入图片描述

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

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

相关文章

毕业论文格式(Word)

目录 Word目录怎么自动生成?快速生成试试这3个方法! - 知乎https://zhuanlan.zhihu.com/p/692056836目录生成需要先设置标题样式,这个不仅是目录生成需要,和后续的图表也有关系。 最好不要自己创建新的样式,而是在现有…

PostGIS实现栅格数据转二进制应用实践【ST_AsBinary】

ST_AsBinary解析与应用实践(同ST_AsWKB) 一、函数概述二、核心参数解析三、典型用法示例四、Out-DB 波段处理机制五、二进制格式与其他格式的转换六、性能与存储优化七、应用场景八、注意事项九、扩展应用:基于Python Web的栅格二进制数据的…

线性回归原理推导与应用(七):逻辑回归原理与公式推导

逻辑回归是一种分类算法,常用于二分类,也就是得出的结果为是和不是,例如通过各种因素判断一个人是否生病,信用卡是否违约等。逻辑回归在社会和自然科学中应用非常广泛, 前置知识 线性回归 逻辑回归的底层方法就是线…

Fastrace:Rust 中分布式追踪的现代化方案

原文链接:Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服务架构中,分布式追踪对于理解应用程序的行为至关重要。虽然 tokio-rs/tracing 在 Rust 中被广泛使用,但它存在一些显著的挑战&#xf…

水果系列数据集- 葡萄grapes>> DataBall

该数据集可以用于目标检测,水果分类 ,文生图相关项目。 以下是图片样例:

HTTP协议接口三种测试方法之-postman

HTTP协议作为现代Web开发的基石,其接口测试是开发过程中不可或缺的环节。Postman作为最流行的API测试工具之一,能够极大提升我们的测试效率。本文将详细介绍如何使用Postman进行HTTP接口测试。 一、HTTP协议基础回顾 在开始使用Postman之前&#xff0c…

佰力博科技与您探讨半导体电阻测试常用的一些方法

一、两探针法​ 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触,通过电源在两根探针之间施加电压,同时使用电流表测量通过样品的电流,再根据欧姆定律计算电阻。​这种方法的优点在于操作简单、设备要求较低&a…

机器学习的一些基本概念

看了b站一个清华博士的视频做的笔记,对于人工智能的底层原理,训练方式,以及生成式文本输出,图片生成的底层原理有了一个了解,算是一个还不错的科普文。之前一直想要了解一下机器学习的入门原理,神经网络相关…

Python爬虫实战:研究Grab 框架相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。如何高效地获取和利用这些数据成为了当前的研究热点。网络爬虫作为一种自动获取网页内容的技术,能够按照一定的规则,自动地抓取万维网信息,在搜索引擎、数据挖掘、信息整合等领域有着广泛的…

uniapp 嵌入鸿蒙原生组件 具体步骤

关于怎么使用uniapp 嵌入鸿蒙原生组件 HBuilder X 版本 4.64 app-harmony文件下新建 index.uts button.ets button.ets里面复制uniapp 官方提供的 示例代码 https://uniapp.dcloud.net.cn/tutorial/harmony/native-component.html button.ets import { NativeEmbedBuilderO…

阿里云 OS Copilot 使用指南

安装: AlibabaCloudLinux: sudo yum install -y os-copilotUbuntu: curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash添加RAM用户 打开 https://ram.console.aliyun.com/users 复制AccessKey,Ac…

枚举类扩充处理

问题背景 由于 Java 不允许枚举继承另一个枚举(enum cannot extend enum),但可以通过 组合方式 或 工具类 来实现类似功能。 ✅ 解决方案一:组合方式引入原始枚举值 示例代码: public enum CustomErrorCodeEnum imp…

Spring Security探索与应用

Spring Security核心概念 框架定位与核心能力 Spring Security是Spring生态中实现应用级安全的核心框架,其官方定义为"强大且高度可定制的认证与访问控制框架"。作为Spring应用程序安全防护的事实标准解决方案,它通过模块化设计提供以下核心能力: 认证(Authenti…

蓝桥杯国14 不完整的算式

!!!!!!!!!!!!!!!理清思路 然后一步步写 问题描述 小蓝在黑板上写了一个形如 AopBC 的算式&#x…

扫描电镜:打开微观世界的“超维相机“

当你用手机拍摄一朵花的微距照片时,放大100倍已足够惊艳。但如果告诉你,科学家手中的"相机"能将物体放大百万倍,连病毒表面的蛋白突触都清晰可见,你是否会好奇这背后的黑科技?这把打开微观宇宙的钥匙&#x…

JVM学习(四)--对象内存布局

目录 一、对象内存布局 1、对象的实例化 1.1、你有几种方式创建对象? 1.2、创建对象的步骤 1.2.1、从字节码角度看待对象创建过程 1.2.2、从执行步骤角度分析 2、对象的内存布局 2.1、对象头 2.2、实例数据 2.3、对齐填充 3、对象的访问定位 3.1、句柄访…

SQL每日一题(4)

前言:第四更 虽然已经全部做完了,这套卷子非常推荐! 根据题目还原出来的原始表 employees表 idnameagestatus1张三28在岗2李四35在岗3王五42在岗4赵六NULL在岗5钱七58在岗6孙八24在岗7周九31离职8吴十-5在岗9郑十一45在岗10王十二52在岗 题…

如何做好一份技术文档?

文章目录 前言一、技术文档的核心原则二、技术文档的类型与场景三、技术文档的写作流程3.1 需求分析阶段(文档生产的基础)3.2 架构设计阶段(文档的骨架搭建)3.3 内容开发阶段(血肉填充)3.4 质量保障阶段&am…

怎么判断一个Android APP使用了KMM这个跨端框架

要判断一个 Android 应用是否使用了 KMM(Kotlin Multiplatform Mobile) 框架,可以通过以下方法逐步验证: 一、安装包结构分析 解压 APK 将 .apk 文件重命名为 .zip 并解压,检查以下特征: • kotlin/ 目录&a…

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…