目录

  • 索引是什么
    • 优点和缺点
  • B树和B+树
    • 红黑树和哈希表存储数据的局限
    • B树
    • B+树
  • MySQL中的页
    • 页是什么
    • 为什么要使用页
    • 页的结构
    • 三层树高的B+树可以存放多少条记录
  • 索引的分类
    • 主键索引
    • 普通索引
    • 唯⼀索引
    • 全⽂索引
    • 聚集索引和非聚集索引(重要)
    • 索引覆盖
  • 创建索引
    • 自动创建
    • 手动创建
      • 创建复合索引
      • 查看索引
  • 索引的一些注意事项

索引是什么

  • MySQL中的索引是一种数据结构, 他可以帮助我们在数据库追上快速的查询到对应的记录. 一般我们查询表里面的记录是一条一条遍历来查询的, 而有了索引我们就不用遍历整个数据表来查询. 对查询速度提升了许多.
  • 就好比我们书籍的目录, 如果我们想看关于挖宝藏的内容, 我们就可以看看书籍目录里面比如"xx宝藏遗址" 之类的标题, 我们就可以看到对应的页数, 直接翻到对应的页数.

优点和缺点

优点:

  • 加快了查找记录的速度

缺点:

  • 索引需要占 磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间, 存储在磁盘上,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。
  • 虽然索引大大提高了査询速度,同时却会 降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

B树和B+树

前面说了, 索引是MySQL中的一个数据结构, 那他使用的是那个数据结构呢? 好像查询速度比较快的就只有哈希表(o(1)查询速度)和红黑树(logn)这两个数据结构查询的速度快吧. 很可惜不是他们两个.

红黑树和哈希表存储数据的局限

  • 哈希表之所以不适合作为索引的数据结构, 其主要原因就是不支持范围查询. 假设有几本书定价为10, 20, 40 , 60, 80, 100元, 他们通过哈希函数定址到同一个0号书架或者分散到不同的书架. 那么现在我们要去寻找50 - 100元之间的书, 你不知道这些书到底在那个书架. 他们有可能在同一个书架也可能在不同的书架, (哈希函数并不支持范围映射, 这里你通过哈希函数找到0, 可能还存在30 % 10 = 0, 30也在0号书架), 所以哈希表不能支持范围查询, 而我们的索引通常会会有查询某个范围数据的需求.
  • 红黑树虽然支持范围查询, (左小跟右大跟), 但是红黑树是一个二叉搜索树, 他一个节点只有两个分支, 也就是每层的节点最多是2^n - 1次方, 这就导致存在数据库里面的大量数据会导致红黑树的高度非常高, 如果我们要进行查询每个数据, 我们有可能就会访问节点访问很多次. 在检索数据时,每次访问某个节点的⼦节点时都会发⽣⼀次磁盘IO,⽽在整个数据库系统中,IO是性能的瓶颈,减少IO次数可以有效的提升性能. 所以红黑树也不适合当索引的数据结构.

B树

在这里插入图片描述

  • B树的分支树是节点N个key值的N + 1条边, 例如第一个节点有4个, 那么这个节点就有5条分支.
  • B树的非叶子节点也有可能存储数据, 所以他的所有节点都有可能存储数据.

这里我们要进行查找40 - 60之间的数据, 这时候我们找到40的右分支, 找到43, 48. 这个时候我们又要回溯到根节点看到50也满足, 然后又去找到他的右分支.找到55这个满足条件的数据. 结果又要回溯到根节点, 发现根节点60这值也满足

  • 可以看到我们进行范围查找的时候, 由于B树的数据都是分散存储在各个节点. 我们进行范围查找的时候需要警察进行回溯操作. 需要不断 “回溯根节点→跳转子节点→再回溯→再跳转”,像走迷宫一样,效率极低。这个效率和全部遍历差不了多少, 所以B树也不太适合作为索引的数据结构.

B+树

在这里插入图片描述

  • B + 树也是一个 N 叉搜索树
  • 每个节点上有 N 个值,划分出 N 个区间 (不是 N + 1 个), 期中最后一个元素表示当前子树的最大值 (也可以约定,第一个元素是最小值…)
  • 每个子节点中,也可以包含 N 个值,同时会把父节点中对应最大值,放过来==> 最终效果,叶子节点,就是完整的数据集合
  • 叶子节点通过双向链表连接起来, 这样我们就可以遍历整个链表就能找到完整的数据集合, 非常适合范围查找.

B + 树相比于 B 树的优势:

  1. 叶子节点是数据全集,并且用链表连接,非常方便,进行范围查询了
  2. 所有的数据都是在叶子上,使得叶子节点才存储完整的数据行,非叶子节点,只需要存储 索引 key 值即可,此时意味着非叶子节点占用空间较小,更适合在内存中缓存
  3. 每次查询,都是需要查询到叶子,才能够完成查询的。中间经历的过程是差不多开销的~~(比较次数是相当的) ==> 查询的开销比较稳定, 比如我们查找1, 5范围数据, 和12, 15范围数据都是遍历到叶子节点, 这个查询效率是大差不差的.很稳定, 稳定其实是非常好的优
  4. 不需要像B树那样一直回溯, 因为数据全集就在叶子节点, 我们只需要遍历叶子节点这个链表即可.

MySQL中的页

页是什么

页其实就是我们B+树上的节点, 这里又分为数据页和索引页. 数据页对应叶子节点, 存储若干个数据行. 索引页对应非叶子节点, 存储key和子节点的位置(也是一个页)

  • 页默认⼤⼩为16KB,

为什么要使用页

因为我们数据库读取硬盘中的数据至少要读取一页, 页里面我们上面说了, 可能存储若干个数据行. 这个又因为我们有一个叫局部性原理的东西: 根据经验如果我们读取了硬盘中的一部分数据, 那么他旁边的数据我们也可能会读取. 那么使用页就会把旁边的一部分数据也存在同一个页中, 这个时候我们把这旁边的数据也读取出来了, 我们就不需要再去硬盘读取那部分数据了. 减少了硬盘的IO次数.

页的结构

在这里插入图片描述

  • 从这张图我们可以看出来, 页是由页头+数据行+页尾构成的, 至于其他的具体内容, 我们在数据库高阶进行讲解.
    在这里插入图片描述

三层树高的B+树可以存放多少条记录

  • B+树的每个节点是一个页, 非叶子节点是索引页, 叶子节点是数据页
  • 一页默认大小是16kb
  • 索引页通常存储key(索引值) 和下一个子节点的位置 , 这里我们设key值是bigint类型占8个字节, 下一个页节点位置的指针占4个字节. 所以我们一个数据组是14个字节, 我们一页16kb = 16384个字节, 可以存储16484 / 14 = 1170条这样的数据组.
  • 那么我们根节点就有1170个这样的数据组, 就有1170个页节点, 第二层1170个节点每个节点也可以存储1170个这样的数据组. 所以单个节点就有1170个分支, 1170个页节点就是1170 * 1170个 = 136w个页节点
  • 到了第3层数据页, 就有了136w个节点, 数据页存储若干个数据行, 假设我们这里的数据行占1kb(实际是多少要看表结构), 我们一个数据页节点默认大小是16kb, 那么我们1个数据页节点就能存储16条数据, 我们有136w个页节点, 就能存储136w * 16 = 2000w条数据(这里忽略了页头页尾这些属性, 他们占太少字节了)
  • 综上, 我们3层树高的B+树大概可以存放2000w条数据

其他要注意的是, 我们如果单个表的行数超过了2000w, 继续增加数据就可能让B+树的高度增加, 查询开销就有可能增加了. 这个时候我们就要考虑是否对这么大的表进行拆分来提升查询性能.

索引的分类

主键索引

创建主键的时候, 数据库自动创建的索引. 如果表中本身有主键, 自然就有主键索引. 如果表里面没有主键, 其实数据库会自动创建"隐藏列", 作为主键, 根据隐藏列设定索引.

普通索引

  • 最基本的索引类型,没有唯⼀性的限制。
  • 可能为多列创建组合索引,称为复合索引或组全索引

唯⼀索引

  • 当在⼀个表上定义⼀个唯⼀键 UNQUE 时,⾃动创建唯⼀索引。
  • 与普通索引类似,但区别在于唯⼀索引的列不允许有重复值。

全⽂索引

  • 基于⽂本列(CHAR、VARCHAR或TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作
  • ⽤于全⽂搜索,仅MyISAM和InnoDB引擎⽀持。

聚集索引和非聚集索引(重要)

  • 聚集索引也叫做聚簇索引.
  • 前面的主键索引就是一个聚簇索引, 他对的叶子结点是保存了所有的数据行. 整个数据表就是通过聚簇索引来表示的
    在这里插入图片描述
  • 非聚集索引也叫做非聚簇索引, 假设我们有一个数据表student(id, name, sex, age), id是一个聚簇索引如上图表示. 现在用name列创建一个非聚簇索引.
    在这里插入图片描述
  • 为了节省空间, 我们不可能每个列的索引(B+树)都把数据行存储在叶子节点, 这里我们非聚簇索引(B+树)的叶子节点存储的就不是全部数据行行了, 而是保存对应数据行的主键id(主键索引存储的数据行)
  • 那么针对name进行查询的时候, 我们不是直接查询到数据行, 而是查询到数据行对应的主键id, 然后再去主键索引中, 查一遍, 得到最终对的数据行(这个再查一遍的操作也叫做回表操作)

注意: 不管是聚簇索引和是非聚簇索引, 我们都有一个前提条件就是要使用MySQL中的innoDB这样的存储引擎, 如果其他的存储引擎有可能主键索引也是非聚簇索引.

  • 那么存储引擎是什么呢? 存储引擎就是负责维护硬盘上数据存储的结构的模块. 对于MySQL来说, 最常用的存储引擎就是InnoDB

索引覆盖

  • 当⼀个select语句使⽤了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时
    就可以直接返回数据,⽽不⽤回表查询,这样的现象称为索引覆盖
  • 就比如说我们select name from student, 那么我们不是查询整个数据行, 我们就可以在普通索引(B+树)的叶子节点就可以找到, 就不需要去主键索引(聚簇索引)哪里去找, 即不进行回表操作. 这个就叫做索引覆盖.

创建索引

自动创建

  • 当我们为⼀张表加主键约束(Primary key),外键约束(Foreign Key),唯⼀约束(Unique)时,
    MySQL会为对应的的列⾃动创建⼀个索引
  • 如果表不指定任何约束时,MySQL会⾃动为每⼀列⽣成⼀个索引并⽤ ROW_ID 进⾏标识(前面说了不创建主键也有一个隐藏列作为主键索引)
  • 这里创建主键, 自动创建
    在这里插入图片描述
  • 创建外键约束和唯一约束自动创建的索引

在这里插入图片描述

  • 这里classID这个列的索引的意义就是为了针对父表class进行修改/删除操作的时候, 需要根据classID在子表student进行查询, 看他存不存在如果存在则不能进行修改/删除操作, 即子表约束了父表.
  • 唯一索引也就是创建唯一约束自动创建的.

手动创建

  • create index 索引名 on 表名(列名)
    在这里插入图片描述
  • 这样我们的student表又增加了一个索引

创建复合索引

在这里插入图片描述

  • 复合索引就是先按第一列查, 如果第一列相同了, 再去按照第二列来查找

查看索引

在这里插入图片描述

索引的一些注意事项

  • 索引应该创建在⾼频查询的列上
  • 索引需要占⽤额外的存储空间
  • 创建过多或不合理的索引会导致性能下降,需要谨慎选择和规划索引(索引会去创建B+树, 如果数据多了, 是会影响性能的)
  • 对表进⾏插⼊、更新和删除操作时,同时也会修索引,可能会影响性能

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

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

相关文章

重生之我在暑假学习微服务第九天《后端拆分部分完结篇》

个人主页:VON文章所属专栏:微服务 微服务系列文章 重生之我在暑假学习微服务第一天《MybatisPlus-上篇》重生之我在暑假学习微服务第二天《MybatisPlus-下篇》重生之我在暑假学习微服务第三天《Docker-上篇》重生之我在暑假学习微服务第四天《Docker-下篇…

如何实现一个简单的基于Spring Boot的用户权限管理系统?

全文目录:开篇语前言系统设计概述步骤一:创建Spring Boot项目步骤二:配置数据库步骤三:定义实体类1. 用户实体类 User2. 角色实体类 Role3. 权限实体类 Permission步骤四:创建JPA Repository步骤五:配置Spr…

机器学习及其KNN算法

一、机器学习概述机器学习(Machine Learning, ML)是人工智能的核心分支,旨在通过算法让计算机从数据中自动学习规律并优化性能,而无需显式编程。这一技术领域起源于20世纪50年代,随着计算能力的提升和大数据时代的到来…

Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!

讲解代码分为3个步骤:有什么用,为什么需要他,如何使用保证大家耐心看完一定大有裨益!如果有懂的可以跳过,不过建议可以看完,查漏补缺嘛。现在开始吧!项目目标我们的目标是根据泰坦尼克号乘客的个…

双目标定中旋转矩阵参数应用及旋转角度计算(聚焦坐标系平行)

一、引言 在双目视觉系统开发中,若需实现右相机坐标系与左相机坐标系平行,核心在于通过双目标定获取的旋转矩阵RRR,消除两相机间的相对旋转。本报告聚焦旋转矩阵的物理意义与工程应用,详细说明如何通过旋转矩阵计算相对旋转角度&a…

GraphRAG 入门教程:从原理到实战

GraphRAG 入门教程:从原理到实战 1. 什么是 GraphRAG? GraphRAG 是一种结构化的、分层的检索增强生成(Retrieval-Augmented Generation,简称 RAG)方法 和传统的 RAG 不同,GraphRAG 不仅仅依赖文本相似度搜索…

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇 一、规划成本管理:为成本管控定方向 规划成本管理是项目成本管理的起点,其核心是明确“如何管”的规则,为整个项目的成本管理提供统一框架。…

Xiphos Q8 SDR DOCK子板 AD9361 宽带收发器的 SDR 模块。

Q8 混合处理器卡的子板,包含基于 ADI 公司流行的 AD9361 宽带收发器的 SDR 模块。与基于 AD9361 的 SDR 模块接口PPS、CAN总线、串行、UART(LVDS)、USB接口电源接口(5V、12V) Q8 处理器卡的子板,集成了基于…

DPU(数据处理单元)架构中,SoC(系统级芯片)与FPGA(现场可编程门阵列)之间的数据交互

在DPU(数据处理单元)架构中,SoC(系统级芯片)与FPGA(现场可编程门阵列)之间的数据交互是实现高效异构计算的关键。根据通信目标和硬件特性,其交互数据类型可分为以下四类:…

图论(邻接表)DFS

竞赛中心 - 蓝桥云课 #include<bits/stdc.h> using namespace std; #define int long long const int A1e51; typedef pair<int,int>p; map<p,int>st; vector<p>edge[A]; int a[A]; int result0; bool dfs(int s,int u,int father,int v,int sum) {i…

深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南

引言&#xff1a;VideoToolbox框架概述 VideoToolbox是Apple提供的底层框架&#xff0c;首次在WWDC2014上推出&#xff0c;为iOS和macOS开发者提供直接访问硬件编码器和解码器的能力。作为Core Media框架的重要组成部分&#xff0c;VideoToolbox专注于视频压缩、解压缩以及Cor…

Python基础语法练习

本文涵盖了 Python 基础编程中的多个重要概念&#xff0c;从简单的输出语句到运算符、字符串操作、变量赋值等都有涉及。这些例子非常适合初学者学习和理解 Python 的基本语法。1. Hello World# 输出Hello Worldprint("Hello, World!")2. 变量赋值# 创建变量并赋值na…

关于“致命错误:‘https://github.com/....git/‘ 鉴权失败”

问题分析 错误信息&#xff1a; remote: Invalid username or token. Password authentication is not supported for Git operations. 致命错误&#xff1a;https://github.com/yarajia/LittleTestToolsProject.git/ 鉴权失败原因&#xff1a;GitHub从2021年8月13日起不再支持…

基于Flask + Vue3 的新闻数据分析平台源代码+数据库+使用说明,爬取今日头条新闻数据,采集与清洗、数据分析、建立数据模型、数据可视化

介绍 本项目为新闻数据分析平台&#xff0c;目的是爬取新闻(目前仅含爬取今日头条)数据&#xff0c;然后对数据进行展示、采集与清洗、数据分析、建立数据模型、数据可视化。本项目采用前后端分离模式&#xff0c;前端使用 Vue3 ArcoDesign 搭建&#xff0c;后端使用 Python …

LabVIEW数字抽取滤波

​基于 LabVIEW 平台设计数字抽取滤波器&#xff0c;用于动态测试领域&#xff0c;解决高采样率数据的大动态范围需求与频带划分问题。方案替换硬件为可靠性优异的品牌&#xff0c;通过虚拟仪器架构实现信号处理功能&#xff0c;为动态信号分析提供高效、可复用的设计参考。应用…

云原生时代的 Linux:容器、虚拟化与分布式的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 在云计算与容器化快速发展的今天&#xff0c;Linux 已经不再只是服务器上的操作系统&#xff0c;而是整个云原生生态的底层基石。无论是运…

多场景两阶段分布式鲁棒优化模型、数据驱动的综合能源系统

基于数据驱动的综合能源系统多场景两阶段分布式鲁棒优化模型 鲁棒优化是应对数据不确定性的一种优化方法&#xff0c;但单阶段鲁棒优化过于保守。为了解决这一问题&#xff0c;引入了两阶段鲁棒优化(Two-stage Robust Optimization)以及更一般的多阶段鲁棒优化&#xff0c;其核…

Python实现点云PCA配准——粗配准

本节我们来介绍PCA&#xff08;主成分分析&#xff09;算法进行点云配准&#xff0c;这是一种经典的统计降维与特征提取工具&#xff0c;在三维点云处理中常被用来完成“粗配准”。其核心思想是&#xff1a;先把两个待对齐的点云各自进行主成分分解&#xff0c;获得各自的“主轴…

零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南

引言在人工智能革命席卷全球的2025年&#xff0c;深度学习已成为改变行业格局的核心技术。本规划路线整合最新教育资源与实践方法&#xff0c;为完全零基础的学习者构建一条从数学基础到AI大模型的系统学习路径。通过清华大佬的实战课程、吴恩达的经典理论、Kaggle竞赛的实战锤…

基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解

在当今互联网时代&#xff0c;在线客服系统已成为企业与用户沟通的重要桥梁。本文将详细介绍如何使用Vue.js作为前端框架&#xff0c;Gin作为后端框架&#xff0c;构建一个高效的在线客服系统。一、项目背景与技术选型项目背景随着电子商务的迅猛发展&#xff0c;用户对即时咨询…