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

news2025/6/4 1:17:39

文章目录

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

🌏索引(上)回顾

  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) unique
 sno 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.coloradmin.cn/o/2386798.html

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

相关文章

leetcode-295 Find Median from Data Stream

class MaxHeap {private heap: number[];constructor() {this.heap [];}// 插入元素并上浮调整push(num: number): void {this.heap.push(num);this.siftUp(this.heap.length - 1);}// 弹出堆顶元素并下沉调整pop(): number {const top this.heap[0];const last this.heap.p…

【后端高阶面经:缓存篇】37、高并发系统缓存性能优化:从本地到分布式的全链路设计

一、缓存性能优化的核心价值与分层架构 (一)缓存的多维价值体系 延迟优化 内存访问速度(100ns) vs 磁盘数据库(10ms+),性能提升10万倍+案例:电商详情页通过缓存将响应时间从500ms降至50ms吞吐提升 单机Redis可支撑10万QPS,分担数据库压力案例:秒杀系统通过缓存拦截9…

欣佰特科技| SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全

Inxpect 成立于意大利,专注工业安全技术。自成立起,便致力于借助先进雷达技术提升工业自动化安全标准,解决传统安全设备在复杂环境中的局限,推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…

【Linux】Linux 操作系统 - 18 , 重谈文件(二) ~ 文件描述符和重定向原理 , 手把手带你彻底理解 !!!

文章目录 ● 文件描述符一 、Linux 系统对文件的管理(要知道)二 、什么是文件描述符 fd ?三 、再探文件被管理过程(重要)四 、文件描述符 0 、1、21. 文件描述符的分配原则2. 提前认识三个默认打开的文件 ● 重定向原理(重要)一 、重定向现象二 、深入剖析重定向现象(重要)1…

第五十三节:综合项目实践-车牌识别系统

一、项目背景与意义 车牌识别系统(LPR)是智能交通领域的核心技术之一,广泛应用于停车场管理、违章抓拍、高速公路收费等场景。本文将通过Python+OpenCV实现一个完整的车牌识别系统,涵盖图像预处理→车牌定位→字符分割→字符识别四大核心环节。 二、系统架构设计 技术栈组…

Git Push 失败:HTTP 413 Request Entity Too Large

Git Push 失败:HTTP 413 Request Entity Too Large 问题排查 在使用 Git 推送包含较大编译产物的项目时,你是否遇到过 HTTP 413 Request Entity Too Large 错误?这通常并不是 Git 的问题,而是 Web 服务器(如 Nginx&am…

第10章 网络与信息安全基础知识

网络概述 多模光纤的特点:成本低,宽芯线,聚光好,耗散大,低效,用于低速度、短距离的通信。 单模光纤的特点:成本高,窄芯线,需要激光源,耗散小,高效…

go 访问 sftp 服务 github.com/pkg/sftp 的使用踩坑,连接未关闭(含 sftp 服务测试环境搭建)

前言 最近在使用 sftp 服务时,被告知发起了海量的连接,直接把服务器搞崩,ip 被封了。 这是啥情况? golang 写的代码,我就正常的访问 sftp 服务,连接使用过后也都关闭了,咋会出现连接一直连着…

Linux多线程(二)之进程vs线程

文章目录 Linux进程VS线程进程和线程进程的多个线程共享关于进程线程的问题 重谈地址空间Linux线程周边的概念 Linux进程VS线程 进程和线程 进程是资源分配的基本单位(进程是承担分配系统资源的基本实体) 执行流也是资源!线程是进程内部的执…

【HW系列】—web常规漏洞(文件上传漏洞)

文章目录 一、简介二、危害三、文件检测方式分类四、判断文件检测方式五、文件上传绕过技术六、漏洞防御措施 一、简介 文件上传漏洞是指Web应用程序在处理用户上传文件时,未对文件类型、内容、路径等进行严格校验和限制,导致攻击者可上传恶意文件&…

如何实现 C/C++ 与 Python 的通信

C/C 与 Python 的通信可以通过多种方式实现,如使用 C API、Ctypes、Cython、SWIG、Python.h 或基于共享库的调用等。其中,使用 Ctypes 方式最为简便,适合快速调用已有的 C 函数库。例如,通过将 C 代码编译为动态链接库&#xff08…

好用但不常用的Git配置

参考文章 文章目录 tag标签分支新仓库默认分支推送 代码合并冲突处理默认diff算法 tag标签 默认是以字母顺序排序,这会导致一些问题,比如0.5.101排在0.5.1000之后。为了解决这个问题,我们可以把默认排序改为数值排序 git config --global t…

ULVAC VWR-400M/ERH 真空蒸发器 Compact Vacuum Evaporator DEPOX (VWR-400M/ERH)

ULVAC VWR-400M/ERH 真空蒸发器 Compact Vacuum Evaporator DEPOX (VWR-400M/ERH)

PPT连同备注页(演讲者模式)一块转为PDF

首先,进入创建PDF/XPS: 然后进入选项: 发布选项-发布内容里选备注页: 导出的原始结果是这样的: 这个时候裁剪一下,范围为所有页面: 最终结果: 如果导出不选“备注页”而是只勾选“包…

项目三 - 任务8:实现词频统计功能

本项目旨在实现一个词频统计功能,通过读取文本文件并利用Java编程技巧处理和分析文本数据。首先,使用BufferedReader逐行读取文件内容,然后通过String.split(" ")方法将每行文本分割成单词数组。接下来,采用HashMap来存…

ollama list模型列表获取 接口代码

ollama list模型列表获取 接口代码 curl http://localhost:11434/v1/modelscoding package hcx.ollama;/*** ClassName DockerOllamaList* Description TODO* Author dell* Date 2025/5/26 11:31* Version 1.0**/import java.io.BufferedReader; import java.io.InputStreamR…

OPC Client第5讲(wxwidgets):初始界面的事件处理;按照配置文件初始化界面的内容

接上一讲,即实现下述界面的事件处理代码;并且按照配置文件初始化界面的内容(三、) 事件处理的基础知识,见下述链接五、 OPC Client第3讲(wxwidgets):wxFormBuilder;基础…

【C++进阶篇】初识哈希

哈希表深度剖析:原理、冲突解决与C容器实战 一. 哈希1.1 哈希概念1.2 哈希思想1.3 常见的哈希函数1.3.1 直接定址法1.3.2 除留余数法1.3.3 乘法散列法(了解)1.3.4 平方取中法(了解) 1.4 哈希冲突1.4.1 冲突原因1.4.2 解…

Spring Boot——自动配置

目录 1.bean加载方式 1.1XML方式声明bean 1.2 xml 注解方式声明bean 1.3通过Configuration和Bean 1.4使用Import注解 1.5使用上下文对象在容器初始化完毕后注入bean 1.6使用ImportSelector接口 1.7实现ImportBeanDefinitionRegistrar接口 1.8bean加载方式(…

使用 Vuex 实现用户注册与登录功能

引言 在构建具有用户认证功能的应用时,Vuex 可以用来管理用户的登录状态和相关信息。以下是如何使用 Vuex 来实现用户注册与登录功能的概述。 🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端…