MySQL索引结构分类及其优劣选择详解

news2024/11/27 8:36:46

什么是索引?

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

为什么要有索引?

简单的来讲,在我们查找数据时,如果数据是乱序且无规律的,此时我们要查找一个数据只能进行遍历,从而找出来所需求的数据。但是如果给对应的数据建立了索引,则可以依据建立好的索引快速的找到需求数据。

建立索引的优缺点

  • 优点:
    1. 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
    2. 可以大大加快数据的检索速度,这是创建索引的主要目的。
    3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    6. 在排序时可以针对索引进行排序,降低数据排序的成本,降低CPU的消耗。
  • 缺点:
    1. 存储数据索引也是需要占用一定空间。
    2. 索引大大提高了查询效率,但是却降低了对数据表增删改操作效率。需要对数据进行增删改,还需要对索引进行调整。

索引的结构

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

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持B+树索引
Hash索引底层书库结构是使用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引)是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。
  • 存储引擎支持的索引结构
索引InnoDBMyISAMMemory
B+Tree索引支持支持支持
Hash索引不支持不支持支持
R-Tree(空间索引)不支持支持不支持
Full-text(全文索引)5.6版本以后支持支持不支持

不特殊说明的情况下,都是说的B+树索引,最为重要。

索引结构的优劣选择

我们知道最常使用的都是B+树索引,那么有没有其他数据结构的索引呢?事实上无论什么数据结构都是可以做索引的,但是其查询的性能是不同的,相对来说,B+树所能应用的场景更多,效率也相对来讲更高一些,那么我们接下来久来探究常见的数据结构充当索引的缺点。

二叉树

顺序插入时会退化为链表,降低查询效率。可以使用红黑树进行改进。

红黑树

是一种自平衡的二叉查找树。虽然成功解决了退化为链表的情况,但是由于其底层还是二叉树,在大量数据的填充下,树的高度会比较大,从而查询效率还是会很低。

B树

又称为多路平衡查找树,即一个节点中可以存储多个数据,这些数据在节点中顺序排列,其树的度可以是任意值,一般树的度都大于2。当等于2时退化为二叉树,每个节点存储一个数据,最多有两个子节点。

图下是一张5阶B树的示意图,5阶即为树的度,节点的最大子节点个树,每个节点中最多存储4个数据。

N阶B树,树的度为N,最多有N个子节点,节点中最多有N-1个数据。

在这里插入图片描述

在B树的数据填充中,如果某个节点的数据个数等于阶数,那么就会向上分裂。

这里我们需要思考一下,阶数为奇数偶数的两种情况。

  • 奇数:这里先简单的说一下奇数阶数的B树,其阶数为奇数,则其每个节点中最大能存储的数据个树就是偶数,那么此时再填充一个数据就需要进行分裂,此时一共有奇数个数据,奇数个数据则就有一个最中间的数据,此时我们只需要将这个中间的数向上分裂,左右两边的数据分裂为左右两个子节点。这个是简单的一种情况。

  • 偶数:前面我们说了奇数阶的B树的分裂情况,但是对于偶数阶的B树,其节点中最多存储奇数个数据,此时再填充一个数据就需要进行分裂,此时一共有偶数个数据,无法找出来一个最中间的数进行向上分裂,这时候我们需要选择最中间偏左或者偏右的数据进行向上分裂,那么就会有两个节点中左节点的数据个树与右节点不同的现象。

B+树

B+树实际上是B树的一个变种,我们知道在B树中,每个节点中都会存储数据,在查询过程中我们需要根据特性在每个节点中进行查找,B+树对此进行了升级,我们只在叶子结点存储数据,在非叶子节点中只存储索引,只起到索引的作用,在所有的叶子结点中有一条方向一样的指针,将非叶子结点连接成了一个单向链表。

在这里插入图片描述

在MySQL中的B+树索引,将标准的B+树结构进行改进,将所有的叶子结点连接成了一个循环双向链表,大大提高了查询效率。

在这里插入图片描述

B+树的查询、插入、删除、修改等操作和B树的逻辑是相似的,这里不过多赘述。

Hash

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

通过哈希算法进行计算,则不可避免的会产生哈希碰撞,即不同的键值对通过哈希算法的计算得出了相同的哈希值,这种现象就叫做哈希碰撞,又叫哈希冲突。解决哈希碰撞的两种常见方法是开放寻址法、再哈希法、拉链法等。

  • 开放寻址法:产生哈希碰撞以后,则从此处一直往后便利寻找,直到解决冲突为止。

  • 再哈希法:将计算出来的哈希值再进行哈希,以此类推直到不产生碰撞为止。

  • 拉链法:将所有产生碰撞的值,都存储在一条链表上。

哈希索引的特点

  • 哈希索引只能用于对等比较(==,in),不支持范围查找。
  • 无法利用索引进行排序。
  • 查询效率高,通常情况下只需要一次检索就可以了,效率通常要高于B+树索引。

为什么InnoDB引擎选择B+树索引?

  • 相对于二叉树,B+树有更少的层级,搜索效率较高。
  • 对于B树来说,无论是叶子结点还是非叶子结点,都会存储数据,这样导致一页中存储的键值对减少,指针跟着减少,要保存同样多的数据,只能增加树的高度,导致效率下降。
  • 哈希索引不支持范围查找和排序操作,应用场景太局限。

索引的分类

索引主要分为4个类型:主键索引、唯一索引、常规索引、全文索引

在这里插入图片描述

在InnoDB存储引擎中,根据索引的存储形式,又分为:聚集索引、二级索引
在这里插入图片描述

聚集索引选取规则:

  • 如果存在主键,则主键索引就是聚集索引
  • 如果不存在主键索引,则会根据第一个非空唯一约束建立聚集索引。
  • 如果没有主键并且没有合适的唯一索引,那么InnoDB则会自动创建一个rowid作为隐藏的聚集索引。

在这里插入图片描述

在查询某个关键字的时候,如果需要查询二级索引,那么在查询二级索引以后并不会直接获取到数据,仅仅只会查询到对应行的id,然后再通过该id查询聚集索引,从而获取到需要的数据。这个过程我们叫做回表查询

注意:

select * from user where id = 10;

select * from user where name = "tom";

在相同条件下,第一条SQL的执行速度是高于第二条的。

因为第二条需要进行回表查询,第一条直接就能查出来需要的数据。

索引的语法

查看索引

SHOW INDEX FROM table_name;

查看table_name表中的所有索引

创建索引

CREATE [UNIQUE | FULLTEXT] INDEX index_name ON table_name(index_col_name,...);

该SQL用来创建索引,创建联合索引时只需要将联合的字段填入table_name()函数内。

[UNIQUE | FULLTEXT] 为可选项

  • 选择UNIQUE:即为创建一条唯一索引

  • 选择FULLTEXT:即为创建一条全文索引

  • 都不选:即创建一条默认索引

  • 主键索引在建表时通过设定的主键自动创建

删除索引

DROP INDEX index_name ON table_name;

删除table_name表中名为index_name的索引

索引名称的命名规则

idx_tableName_fildName idx+表名+字段名

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

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

相关文章

Nacos集群设置开机自启动

一、搭建前提需要的环境 -rw-rw-rw-. 1 root root 8491533 Mar 5 20:05 apache-maven-3.3.9-bin.tar.gz -rw-rw-rw-. 1 root root 189815615 Mar 23 2018 jdk-8u162-linux-x64.tar.gz -rw-r--r--. 1 root root 25548 Apr 7 2017 mysql57-community-release-el7-10.n…

HTML、CSS学习笔记7(移动适配:rem、less)

一、移动适配 rem:目前多数企业在用的解决方案vw / vh:未来的解决方案 1.rem(单位) 1.1使用rem单位设置尺寸 px单位或百分比布局可以实现吗? ————不可以 网页的根字号——HTML标签 1.2.rem移动适配 写法&#x…

双碳目标下基于“遥感+”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟

目录 专题一、双碳视角下遥感技术的研究方向 专题二、生态系统碳库的遥感估算—以森林碳储量为例 专题三、生态系统碳收支的遥感模拟—以京津冀地区为例 专题四、区域能源消耗碳排放空间格局模拟—基于夜间灯光数据 专题五、土地利用变化碳排放效应的遥感监测—以城市扩张…

PLSQL Developer 安装指南

PLSQL Developer 是 Oracle 的客户端。 下面以64位破解版的PLSQL Developer为例,进行PLSQL Developer 安装讲解。 0. 下载 PLSQL Developer https://download.csdn.net/download/Shipley_Leo/87557938 1. 根据操作系统选择对应“plsqldev.exe”可执行文件&#xff…

虚拟平台中的“有意”/“无意”故障注入

构建虚拟平台的重点往往会放在系统运行,尤其是在汽车和航空航天的数字孪生领域。只有确保虚拟平台能够正常运行系统,软件才得以可靠地在虚拟平台上运行。 为确保系统正常运行,通常需要解决如何测试异常、故障和其他问题。该过程通常被称为“…

【Linux】vi和vim编辑器

目录主题主题 三种常见模式: 正常模式 以vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用[上下左右]按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用「复制、…

监控开源方案

监控开源方案可观测性指标监控日志监控链路追踪开源产品ZabbixOpen-FalconPrometheusNightingale监控需求 : 系统出现问题 , 能及时感知了解数据趋势,预测未来可能出问题了解系统的水位,为服务扩缩容提供数据支撑感知待优化点,如 : 中间件参…

【Unity VR开发】结合VRTK4.0:创建一个按钮(Togglr Button)

语录: 有人感激过你的善良吗,貌似他们只会得寸进尺。 前言: Toggle按钮是提供简单空间 UI 选项的另一种方式,在该选项中,按钮将保持其状态,直到再次单击它。这允许按钮处于激活状态或停用状态的情况&#…

固态存储设备固件升级方案

1. 前言 随着数字化时代的发展,数字数据的量越来越大,相应的数据存储的需求也越来越大,存储设备产业也是蓬勃发展。存储设备产业中,发展最为迅猛的则是固态存储(Solid State Storage,SSS)。数字化时代,海量…

【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(新的开篇)”】

目录【ESP32freeRTOS学习笔记】系列新的开篇ESP-IDF对FreeRTOS的适配ESP-IDF环境中使用FreeRTOS的差异性简介关于FreeRTOS的配置关于ESP-IDF FreeRTOS Applications结语【ESP32freeRTOS学习笔记】系列新的开篇 ESP-IDF对FreeRTOS的适配 FreeRTOS是一个可以适用于多个不同MCU开…

JavaWeb开发(三)3.6——代理模式

一、代理模式概述 1.1、代理模式的理解 参考人家的举例,感觉挺形象,容易理解: 就拿明星与经纪人的关系来说,明星就好比被代理类,明星只需要负责唱歌,表演或给粉丝签名等事务,而类似签合同&…

Jenkins从配置到实践

Jenkins从配置到实践 1 持续集成 Continuous integration(CI) 1.1 什么是持续集成? 持续集成Continuous integration(CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员…

COLMAP

简介:在使用instant-ngp过程中需要使用COLMAP得到模型的必要输入,比如模型需要的相机外参我们就可以通过COLMAP中的sparse reconstruction稀疏重建得到;而对于depth map深度图我们则需要dense reconstruction稠密重建得到,下面我们…

STM32Cube STM32MP157 M4端CAN通讯实战

1、环境 开发系列:STM32MP157 开发软件:STM32CubeIDE 1.4.0 例程目的:在M4端实现CAN通讯 2、目的 近日,有客户需要在STM32MP157中的M4端实现CAN通讯,我也是初次在M4端编写CAN通讯代码,上网研究了其他人写…

从LeNet到ResNet:深入探索卷积神经网络

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

论文解读15——LightGBM: A Highly Efficient Gradient Boosting Decision Tree

目录1、文章贡献2、直方图算法Histogram(减少分裂点)3、基于梯度的单边采样算法GOSS(减少样本量)4、互斥特征捆绑算法EFB(减少特征)在上篇中提到,XGBoost算法的局限是它在寻找最优分裂点算法中需…

AidLux AI应用案例悬赏选题 | 电路板表面瑕疵检测

AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式,悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域,内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…

正点原子裸机开发之C语言点灯程序

一. 简介 本文针对 IMX6ULL 的裸机开发的(即不带Linux操作系统的开发)。 主要分两部分的工作: 1. 配置 C语言运行环境 2. C 语言编写及运行 二. 配置C语言运行环境 配置 C 语言运行环境的工作分 三部分。如下: 1. 设置…

Nginx配置实例-反向代理案例一

实现效果:使用nginx反向代理,访问 www.suke.com 直接跳转到本机地址127.0.0.1:8080 一、准备工作 Centos7 安装 Nginxhttps://liush.blog.csdn.net/article/details/125027693 1. 启动一个 tomcat Centos7安装JDK1.8https://liush.blog.csdn.net/arti…

YonBuilder 应用构建全新入门指南

用友开发者中心以 YonBuilder 低代码开发为核心,提供可视化 低代码 全代码的一站式开发能力,企业组织和个人开发者可实现业务应用的快速开发。YonBuilder 基于用友 BIP 强大的中台支撑能力,在元数据驱动和运行框架的统一模型架构下&#xf…