MySQL 索引(上)

   

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL-进阶篇
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

目录

 🚀索引概述

 🚀索引的特点 

🚀索引结构

🚀二叉树

🚀红黑树

 🚀B树:为磁盘而生

🚀B树的构建  (这里引用的是一个博主的构建过程,我觉得还不错http://t.csdnimg.cn/3VtX2)

 🚀B+Tree  (以下这里引用了黑马部分)

 🚀Hash

🚀为什么InnoDB存储引擎选择使用B+tree索引结构? 


🚀索引概述

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构  上实现高级查找算法,这种数据结构就是索引。

 索引说明:

假设我们要执行的SQL语句是:select * from emp where age =  43 ;

✨无索引

在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为全表扫描,性能很低。

✨有索引

如果我们针对于这张表建立了索引,假设索引结构就是二叉树,那么也就意味着,会对age这个字段建立一个二叉树的索引结构。

此时我们在进行查询时,只需要扫描三次就可以找到数据了,极大的提高的查询的效率。

注意:这里我们只是假设索引的结构是二叉树,介绍一下索引的大概原理,只是一个示意图,并不是索引的真实结构,索引的真实结构通常是基于B树或者B+树

 🚀索引的特点 

特点优点缺点
提高检索速度加快数据的检索速度,特别是对大表进行检索时增加了写操作的时间,因为每次插入、更新和删除都需要维护索引
唯一约束可以确保列或列组合的唯一性唯一索引会增加写操作的开销
加速排序在使用ORDER BY子句进行排序时可以加快查询速度占用额外的磁盘空间
加速分组和联接对于GROUP BY和JOIN操作,索引可以提高查询性能不恰当的索引可能导致查询性能下降
全文搜索允许对文本字段进行高效的全文搜索需要额外的存储空间,并且不支持所有的数据类型
减少IO成本可以减少磁盘IO的次数,提高查询效率创建和维护索引需要额外的计算资源

🚀索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:

索引结构

描述

B+Tree索引

最常见的索引类型大部分引擎都支持  B+ 树索引

一种自平衡的多路搜索树,所有关键字都存储在叶子节点上,并且叶子节点之间通过指针连接形成有序链表。非叶子节点只包含键值信息,不包含实际数据。适用于范围查找,对于数据库系统来说更加适用。

Hash索引

底层数据结构是用哈希表实现 , 只有精确匹配索引列的查询才有效 , 适用于等值查找,支持范围查询

R-tree(空间索引)

空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据 型,通常使用较少

Full-text(索引 )

是一种通过建立倒排索引 ,快速匹配文档的方式类似于

Lucene,Solr,ES

用于全文搜索的索引结构,支持对文本字段进行高效的全文搜索,适用于大段文本的搜索。

上述是MySQL中所支持的所有的索引结构接下来我们再来看看不同的存储引擎对于索引结构的支持情况。

InnoDB

MyISAM

Memory

B+tree索引

Hash 索引

不支

不支

R-tree 索引

不支

不支

Full-text

5.6版本之后支持

不支

 注意:我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

🚀二叉树

二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 
如下图所示就是一棵二叉查找树, 

假如说MySQL的索引结构采用二叉树的数据结构,理想状态下结构是:

如果主键是顺序插入的,则会形成一个单向链表:

所以,如果选择二叉树作为索引结构会存在以下缺点

✨顺序插入时,会形成一个链表,查询性能大大降低。

✨大数据量情况下,层级较深,检索速度慢。

🚀红黑树

此时大家可能会想到我们可以选择红黑树红黑树是一颗自平衡二叉树那这样即使是顺序插入数 据,最终形成的数据结构也是一颗平衡的二叉树 ,结构如下 : 

✨对于数据在内存中的情况(如上述的TreeMap和HashMap),红黑树的表现是非常优异的。但是对于数据在磁盘等辅助存储设备中的情况(如MySQL等数据库),红黑树并不擅长,因为红黑树长得还是太高了。当数据在磁盘中时,磁盘IO会成为最大的性能瓶颈,设计的目标应该是尽量减少IO次数;而树的高度越高,增删改查所需要的IO次数也越多,会严重影响性能。

✨所以,在MySQL的索引结构中,并没有选择二叉树或者红黑树,而选择的是B+Tree,那么什么是 B+Tree呢?在详解B+Tree之前,先来介绍一个B-Tree。

 🚀B树:为磁盘而生

B-Tree  B树是一种多叉路衡查找树,相对于二叉树,  B树每个节点可以有多个分支,即多叉。

以一颗最大度数(max-degree5(5)b-tree为例那这个B树每个节点最多存储4key,5

个指针:

✨B树,也是自平衡的排序查找树,但是不要求子节点数目必须小于2。

✨每个节点可以有最多M个子节点,M>=2,M即为B树的阶数

✨每个节点中可以存储最多M个、最少M/2向上取整个key,一般为2-3个。

✨所有叶子节点均在同一层

树的度数指的是一个节点的子节点个数。

在这里插入图片描述

还有一个更详细的图:

 

🚀B树的构建  (这里引用的是一个博主的构建过程,我觉得还不错http://t.csdnimg.cn/3VtX2)

B树的构建过程中每个节点中的关键字的个数都在动态改变。

因为其构建过程是:先对节点先扩充,当节点中关键字数量扩充到等于M时,再对其进行拆分,并将中间数升到父节点中去。

例如:定义一个5阶树(平衡5路查找树;),现在我们要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来;

遵循规则:

(1)节点拆分规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须<=5-1(这里关键字数>4就要进行节点拆分);当节点中关键字数大于4时,就将中间的关键字升为父节点的关键字(如果没有父节点,则创建一个父节点),然后创建此父节点的两个子节点,将中间关键字两边的关键字分别存储到这两个子节点中。

(2)排序规则:满足节点本身比左边节点大,比右边节点小的排序规则;

先插入 3、8、31、11
在这里插入图片描述
再插入23、29
在这里插入图片描述再插入50、28
在这里插入图片描述

特点:

✨5阶的B树,每一个节点最多存储4个key,对应5个指针。

✨一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。

✨在B树中,非叶子节点和叶子节点都会存放数据。

 🚀B+Tree  (以下这里引用了黑马部分)

B+TreeB-Tree的变种,我们以一颗最大度数(max-degree4 4b+tree为例来看一 下其结构示意图:

我们可以看到,两部分:

✨绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。

✨红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。

插入一组数据100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250 然后观察一些数据插入过程中节点的变化情况

 最终我们看到,B+Tree 与  B-Tree相比,主要有以下三点区别:

所有的数据都会出现在叶子节点。

叶子节点形成一个单向链表。

非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的 

上述我们所看到的结构是标准的B+Tree的数据结构接下来我们再来看看MySQL中优化之后的 B+Tree

✨MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点 的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。

 🚀Hash

✨MySQL中除了支持B+Tree索引,还支持一种索引类型---Hash索引。

✨哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。

 如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可 以通过链表来解决。

✨Hash索引只能用于对等比较 (=,  in),不支持范围查询(between,  >,  < ,   ...)

✨无法利用索引完成排序操作

✨查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引 

存储引擎支持

在MySQL中,支持hash索引的是Memory存储引擎。    而InnoDB中具有自适应hash功能,  hash索引是 InnoDB存储引擎根据B+Tree索引在指定条件下自动构建的。

🚀为什么InnoDB存储引擎选择使用B+tree索引结构? 

✨平衡的高效查找: B+树具有平衡性,使得在大数据量情况下,查询操作的时间复杂度保持在较低水平(通常为O(log n))。

✨多路搜索: B+树的多路搜索特性使得每一步操作都能跳过大量的数据,从而提高了查询效率。

✨对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储 的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;

✨相对Hash索引,  B+tree支持范围匹配及排序操作

(范围查询: B+树索引结构天生适合范围查询,因为其内部有序排列的特性可以快速定位到范围的起始点,并且进行连续的遍历。

顺序访问: B+树的叶子节点形成有序链表,这使得对整个表进行顺序扫描时非常高效。)


希望对你有帮助!  

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

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

相关文章

libpcap简明教程

文章目录 前言tcpdump的使用libpcap API的简单使用libpcap API的进阶使用 前言 因为之前简单写过wireshark入门指北&#xff0c;所以我知道基本的抓包流程。最近尝试调用libpcap的C API接口&#xff0c;顺道整理下。 本文实验如下&#xff1a; 使用tcpdump命令抓取目标地址为…

【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视&#xff08;Hikvision&#xff09;公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload&#xff0c;后端使用文件上传阿里云报错&#xff1a; 报错原因&#xff1a;前端image参数未传进去 解决方法&#xff1a;在el-upload添加属性 name"image" 文件传进去了&#xff01;

回溯法:0-1背包问题

问题描述 给定种物品和一背包。 物品的重量是&#xff0c; 其价值为&#xff0c;背包的容量为 c。 问应该如何选择装入背包中的物品&#xff0c;使得装入背包中物品的总价值最大&#xff1f;注意物品不重复! 实例&#xff1a;物品价值V{12, 11, 9, 8}, 物品重量W{8, 6, 4, 3},…

手写Vue3源码

Vue3核心源码 B站视频地址&#xff1a;https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式&#xff0c;只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块&#xff0c;…

Fog-Aware Adaptive YOLO for Object Detection in Adverse Weather

Abstract 提出了一种雾自适应YOLO算法。使用一种雾评估算法将图片分为有雾和无雾图片&#xff0c;随后将标准的YOLO应用于正常图片&#xff0c;自适应YOLO应用于有雾图片。 Method 目前的除雾方法去除雾霾时不考虑其雾度和发生频率。例如&#xff0c;图像自适应YOLO算法[6]试…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址&#xff08;含历史版本&#xff09;&#xff1a;https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1&#xff0c;安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料&#xff08;Qt C…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

Python——面向对象案列

1. class User(object):#重写__int__初始化方法&#xff0c;该方法用来初始化属&#xff0c;在构建方法的时候&#xff0c;这个方法会自动触发&#xff0c;用来初始化属性def __init__(self): #name “” 这是一个局部变量#self类似指针 this#self.name类的属性print("构…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

无刷电机学习-原理篇

一、无刷电机的优点 使用一项东西首先就要明白为什么要使用它&#xff0c;使用它有什么优点。与有刷电机相比无刷电机除了控制繁琐几乎全是优点。 1、应用范围广&#xff1a;家用电器&#xff08;冰箱空调压缩机、洗衣机、水泵等&#xff09;、汽车、航空航天、消费品工业自动…

4个值得使用的免费爬虫工具

在信息时代&#xff0c;数据的获取对于各行业都至关重要。而在数据采集的众多工具中&#xff0c;免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具&#xff0c;突出介绍其中之一——147采集软件&#xff0c;为您揭示这些工具的优势和应用&#xff0c;助您在数…

【c语言】扫雷(上)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…

nodejs前端项目的CI/CD实现(二)jenkins的容器化部署

一、背景 docker安装jenkins&#xff0c;可能你会反问&#xff0c;这太简单了&#xff0c;有什么好讲的。 我最近就接手了一个打包项目&#xff0c;它是一个nodejs的前端项目&#xff0c;jenkins已在容器里部署且运行OK。 但是&#xff0c;前端组很追求新技术&#xff0c;不…

中小企业股权质押融资(下)

股权质押融资的主要风险 由于股权资产的特殊性&#xff0c;较固定资产抵押和质押、第三方担保等方式&#xff0c;股权质押融资风险易受企业经营状况等因素的影响&#xff0c;主要包括股权价值下跌的风险、股权质押的道德风险、股权处置风险以及现行法律不完善导致的法律风险。…

前端面试题汇总大全(含答案)-- 持续更新

​一、HTML 篇 1. 简述一下你对 HTML 语义化的理解&#xff1f; 用正确的标签做正确的事情。 html 语义化让页面的内容结构化&#xff0c;结构更清晰&#xff0c;便于对浏览器、搜索引擎解析&#xff1b;即使在没有样式 CSS 情况下也以一种文档格式显示&#xff0c;并且是容易…