MySQL索引1——基本概念与索引结构(B树、R树、Hash等)

news2024/10/5 19:15:58

目录

索引(INDEX)基本概念

索引结构分类

B+Tree树索引结构

Hash索引结构

Full-Text索引

R-Tree索引


索引(INDEX)基本概念

什么是索引

索引是帮助MySQL高效获取数据的有序数据结构

为数据库表中的某些列创建索引,就是对数据库表中某些列的值通过不同的数据结构进行排序

为列建立索引之后,数据库除了维护数据之外,还会维护满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现快速查询,这种数据结构就是索引

索引的作用

通过索引可以将无序的数据变为有序的数据,能够实现快速访问数据库表中的特定信息

优缺点

优点

提高数据检索的效率,降低数据库的IO成本

通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗

缺点

索引会占用空间

索引提高了表的查询效率,但是却降低了更新表的速度(Insert、Update、Delete)

索引只是一个提高效率的因素,如果MySQL有大数据量的表,就需要花时间研究最优秀的索引(即需要研究为哪些字段建立索引能够使得效率提升到最大化,因为一条查询语句只会引用到一种索引,并且一般建议一个表建立的索引数量不要超过5个)


索引结构分类

索引结构主要分为四大类

B+Tree索引-(B+树)

最常见的索引类型,大部分的存储引擎都支持此索引

Hash索引-(Hash表)

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

Full-Text索引-(倒排索引)

又名全文索引,是一种通过建立倒排索引,快速匹配文档的方式

R-Tree索引(R-Tree树)

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

存储引擎对不同索引的支持情况(默认B+Tree索引)

 在MySQL数据库中,支持Hash索引的是Memory引擎;而InnoDB中具有自适应Hash的功能,根据B+tree索引在指定条件下自动构建的

B+Tree树索引结构

B+Tree树是由二叉树 → 红黑树(自平衡二叉树) → B-Tree树烟花而来的,我们在介绍B+Tree树之前先介绍这三种数据结构

二叉树

二叉树的每个节点最多有两个子节点(两颗子树);并且两个子节点是有序的

以单个节点为例:左边子节点是比自身小的,右边子节点是比自身大的

缺点

  1. 大数据量的情况下,层级较深,检索速度慢
  2. 容易形成倾斜树(左倾斜或右倾斜)

 二叉树的工作原理

 二叉树的数据插入(依次插入30、40、20、19、21、39、35)

 二叉树的数据遍历

 二叉树的数据查找(查找39 、21、25)

 二叉树的数据删除(依次删除19、39、30)

红黑树(自平衡二叉树)

红黑树时二叉树的变种,可以解决二叉树插入数值时产生斜树的问题

任何一个节点都有颜色(红色或黑色),通过颜色来确保树在插入和删除时的平衡

根节点一定是黑色的;Null节点被认为是黑色的;每个红色节点的两个叶子节点都是黑色

每个叶子节点到根的路径上不能出现连续的红色节点

任何一个节点到达叶子节点所经过的黑节点个数必须相等

当在红黑树中进行插入和删除操作时,会通过左旋、右旋、重新着色来修复树结构,保持树的平衡

缺点

  1. 在进行大量插入和删除操作的情况下,可能会造成频繁的树重构,影响性能
  2. 红黑树的实现比较复杂,需要维护节点的颜色和平衡
  3. 红黑树本质也是二叉树,在大数据量的情况下,层级较深,检索速度会下降

红黑树的工作原理

红黑树的数据插入(依次插入30、40、20、19、21、39、35)  使用到了右旋

红黑树的数据遍历

红黑树的数据查找(查找39 、21、25)

红黑树的数据删除(依次删除19、39、30)

B-Tree树(多路平衡查找树)

二叉树一个Node节点只能够存储一个Key和一个Value,并且只有两个子节点;而多路树相比较而言一个Node节点能够存储更多的Key和Value,能够携带更多的子节点,建树高度会比二叉树要低

B-Tree树的一个节点能够存储多少Key和Value,可以有多少个子节点通过最大度数(MAX-Degree 也称为阶数)决定

一个m阶的B-Tree树

       树中的每个节点最多有m个子节点,m-1个Key和Value(两个子树的指针夹着一个Key和Value)

       树的根节点至少有一个Key和Value,至少两个子节点

缺点

B树的叶子节点和非叶子节点都会保存数据,使得非叶子节点保存的指针量变小

如果存储大量的数据,需要增加树的高度,导致IO操作变多,查询性能变低

B-Tree树的工作原理

B-Tree树的数据插入Max-Degree为3(依次插入30、40、20、19、21、39、35)

B-Tree树的数据遍历

B-Tree树的数据查找(查找39 、21、25)

B-Tree树的数据删除(依次删除19、39、30)

B+Tree

B+Tree树是B-Tree树的变种,也是一种多路搜索树,定义基本与B-Tree相同

B+Tree只有叶子节点存储数据,并且所有的元素都会出现在叶子节点中,所有叶子节点形成了一个单向链表;叶子节点将数据按照大小排列,并且相邻叶子节点之间按照大小排列

非叶子节点不存储数据,只存储Key,只是起到索引的作用,在相同的数据量下,B+Tree树更加矮壮

B-Tree树的工作原理

B+Tree树的数据插入Max-Degree为3(依次插入30、40、20、19、21、39、35)

B+Tree树的数据遍历

B+Tree树的数据查找(查找39 、21、25)

B+Tree树的数据删除(依次删除19、39、30)

MySQL的B+Tree索引结构

MySQL的索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,所有叶子节点形成了一个双向链表,提高了遍历速度

MySQL在查询是根据查询条件查询对应的键值(Key),然后将键值对应数据(Value)提取出来

Hash索引结构

哈希索引就是采用一定的hash算法,将键值换算成新的Hash值,将哈希值映射到一个桶中,桶中存储了所有哈希值相同的数据行的指针,然后存储在Hash表中;

当查询时,MySQL会先通过哈希函数计算出查询条件的哈希值,在Hash表中查找对应的桶,然后在对应的桶中查找相应的数据行

哈希冲突

如果两个或多个键值,映射到同一个相同的槽位(桶),则他们就产生了hash冲突,通过链表解决

 特点

  1. Hash索引只能够用于对等比较(=,in等),不支持范围查询(between,>,<等)
  2. 无法利用Hash索引完成排序操作;因为Hash索引中存放的是经过Hash计算后的Hash值,此值的大小并不一定和Hash运算之前的键值完全一样
  3. Hash索引无法避免表扫描,即每次都要全表扫描;因为Hash索引是将键值通过Hash运算之后,将其结果和对应的行指针信息存放在一个Hash表中,由于不同的索引键可能存在相同的Hash值,也就是哈希冲突,所以满足某个Hash键值的数据的记录跳数,无法直接从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行比较,并得到相应的结果
  4. 对于联合索引,Hash不能使用部分索引键查询(要么全部使用,要么全部不使用)
  5. Hash只需要做一次运算,就可以找到该数据所在的桶;不像树结构那样从根、叶子节点的顺序来查找;所以Hash索引的查询效率理论上是要高于B+Tree的;不过对于存在大量Hash值相同的情况下,性能不一定比B+Tree高

Full-Text索引

通过建立倒排索引(Inverted Index)构建Full-Text索引,提高数据的检索效率

倒排索引是一种将文档中的单词/汉字映射到其出现位置的数据结构,主要用来解决判断字段的值中 是否包含 某字符/汉字的问题

我们对于简单业务或者数据量小的业务,可以通过Like()关键字来判断;但是对于大数据量业务,使用Like效率会大大降低

不同存储索引对Full-Text索引的支持

在MySQL5.6版本之前,只有MYISAM存储引擎支持全文索引

在MySQL5.6版本之后,InnoDB能够支持全文索引;不过只支持对英文的全文索引,不支持中文的全文索引;后续通过内置分词器(ngram)来支持中文索引

配置ngram的最小长度

在MySQL的配置文件中添加以下字段

ft_min_word_len = 2     #此最小长度就是分词的最小长度,默认为2

即:对于一段语句,可以分为多个汉字组,每个汉字组最少都有2个汉字

    我想学习数据库  可以分词为: 我想 学习  数据库 三个组

一般不会将ngram设置的很小,如果很小的话会占用大量的空间,因此我们一般都不修改此最小长度,就默认为2

全文索引的流程

用户输入要查找的内容 → SQL执行引擎 → ngram对查找的内容进行分词 → 把分词后的词依次的去倒排索引中去查找 → 将相应的记录返回

分词器ngram在建立索引时会对字段中的值进行分词;在进行查询时也会对要查找的内容分词

R-Tree索引

构建空间索引有多种数据结构,例如四叉树、R-Tree树

在MySQL中是通过R-Tree树来构建空间索引的,是一种加快空间数据查询速度的技术

R-tree将空间数据分割成一系列矩形区域,每个节点可以表示一个矩形区域,同时可以包含其他节点或数据项。这种层级结构允许MySQL在空间查询中更快地定位所需的数据,减少搜索范围,从而提高查询性能

例如:

一个表中的某字段存储着一个地方餐馆的经纬度位置信息,现在我们需要根据我们的位置,找附近1公里的餐馆

我们可以通过计算我们的位置,找到附近1公里范围内的经纬度范围,然后查询表中的满足此经纬度的值;为了加快检索效率,我们就可以对存储经纬度位置信息的字段建立空间索引

R-Tree的构建过程——R树是把B树的思想扩展到了多维空间

1、数据划分

所有的数据项也成为对象(点、线或面)都被视为一个单独的矩形

2、构建叶子节点(叶子节点是R树的底层节点)

将划分好的矩形进行分组,并构建叶子节点;每个叶子节点包含多个对象及其对应的矩形

3、合并叶子节点

当叶子节点的数目超过了R-Tree规定的最大容量,此时R树会尝试合并相邻的叶子节点来减少树的高度和提高查询效率

4、构建非叶子节点

将合并后叶子构建为新的非叶子节点;非叶子节点也是一个矩形,包含了其所有子节点的矩形范围

5、递归构建

重复上述的操作,知道构建出整个R树的根节点(R树的最顶层节点,将包含所有的数据范围)

具体R树的构建方式可以参考以下文章

从B树、B+树、B*树谈到R 树_v_JULY_v的博客-CSDN博客https://blog.csdn.net/v_JULY_v/article/details/6530142

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

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

相关文章

MVC配置原理

如果你想保存springboot的mvc配置并且还想自己添加自己的配置就用这个。 视图解析器原理&#xff0c;它会从IOC容器里获取配置好视图解析器的配置类里的视图解析器集合&#xff0c; 然后遍历集合&#xff0c;生成一个一个的视图对象&#xff0c;放入候选 视图里&#xff0c;…

【华秋干货铺】PCB布线技巧升级:高速信号篇

如下表所示&#xff0c;接口信号能工作在8Gbps及以上速率&#xff0c;由于速率很高&#xff0c;PCB布线设计要求会更严格&#xff0c;在前几篇关于PCB布线内容的基础上&#xff0c;还需要根据本篇内容的要求来进行PCB布线设计。 高速信号布线时尽量少打孔换层&#xff0c;换层优…

word转pdf两种方式(免费+收费)

一、免费方式 优点&#xff1a;1、免费&#xff1b;2、在众多免费中挑选出的转换效果相对较好&#xff0c;并且不用像openOffice那样安装服务 缺点&#xff1a;1、对字体支持没有很好&#xff0c;需要安装字体库或者使用宋体&#xff08;对宋体支持很好&#xff09;2、对于使…

使用vuex让购物车联动

// 1.vuex点击加减触发函数提交仓库把我们请求的数据存到仓库 2.在仓库定义这个函数和对象 把我们存进去的数据存起来 // 3。在我们需要的页面拿出数据&#xff0c;然后循环就可以 // 4.当我们点击加号就触发函数然后在vuex对这个数据进行处理 // 5.对我们点进来的数据进行一个…

使用自适应去噪在线顺序极限学习机预测飞机发动机剩余使用寿命(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【零基础学Rust | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust4&#xff0c;Rust可以做什么 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编…

无头单链表,有完整测试程序

&#x1f35f;无头单链表 &#x1f47b;无头单链表的所有结点都存储有效信息 &#x1f47b;无头单链表相对带头单链表&#xff0c;在有些涉及更改头节点的函数上需要传二级指针 &#x1f35f;头文件list.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #includ…

不能乱点链接之获取cookie

这里是浏览器存储的某个网址的cookie 然后点击了链接就把参数获取到 因为document.cookie 会直接获取到浏览器cookie 所以为了拦截 存cookie的时候要设置&#xff1a; 设置httpOnly 只要http协议能够读取和携带 再document.cookie 就为空了 原文链接&#xff1a; 尚硅谷课程…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

SolidUI社区-从开源社区角度思考苹果下架多款ChatGPT应用

文章目录 背景下架背景下架原因趋势SolidUI社区的未来规划结语如果成为贡献者 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目…

Typescript中的元组与数组的区别

Typescript中的元组与数组的区别 元组可以应用在经纬度这样明确固定长度和类型的场景下 //元组和数组类似&#xff0c;但是类型注解时会不一样//元组赋值的类型、位置、个数需要和定义的类型、位置、个数完全一致&#xff0c;不然会报错。 // 数组 某个位置的值可以是注解中的…

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述 Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后&#xff0c;使用单个命令&#xff0c;您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系&#xff08;…

纷享销客携30+企业家朋友走进国产燃气轮机领军企业——新奥动力

7月26日下午&#xff0c;【数字中国-高效增长】名城优企游学系列活动之走进新奥动力成功举办&#xff01;新奥动力是国产燃气轮机领军企业&#xff0c;成立于2013年&#xff0c;致力于成为国际领先的微、小型燃气轮机制造商&#xff0c;其多项技术、产品填补国内空白。2022年新…

算法通关村—迭代实现二叉树的前序,中序,后序遍历

1. 前序中序后序递归写法 前序 public void preorder(TreeNode root, List<Integer> res) {if (root null) {return;}res.add(root.val);preorder(root.left, res);preorder(root.right, res);}后序 public static void postOrderRecur(TreeNode head) {if (head nu…

基于Web智慧森林防火GIS监测预警可视化系统

森林火灾是森林最危险的敌人&#xff0c;也是林业最可怕的灾害&#xff0c;它会给森林带来毁灭性的后果。 建设背景 森林火灾&#xff0c;重在预防。随着现代技术的快速发展&#xff0c;数字化森林监控已成为及早发觉&#xff0c;排除森林火灾隐情的必要手段。充分利用现代科…

C++ 指针数组

如果一个数组的每个元素都是指针变量&#xff0c;这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。 1.一维指针数组 声明一维指针数组的语法形式&#xff1a; 数据类型*数组名[下标表达式];下标表达式指出数组元素的个数&#xff0c;数据类型确定每个元素…

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

浙大数据结构第六周之06-图3 六度空间

题目详情&#xff1a; “六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一…

动手学深度学习—卷积神经网络(原理解释+代码详解)

目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…