MySQL:索引有哪些(清晰明了)

        一提到索引,可能就会想到B+树索引、Hash索引、聚簇索引、主键索引、唯一索引、联合索引等等,但这些名词并不能混为一谈,他们有重复的部分,是从不同方面给索引取的名字。

        从数据结构上来讲:B+树索引、Hash索引、Full-text 索引;

        从物理存储上来讲:聚簇索引(主键索引)、二级索引(辅助索引);

        从索引字段上来讲:主键索引、唯一索引、普通索引、前缀索引;

        从字段数量上来讲:单列索引、联合索引;

那么我就从各个方面来介绍一下这些索引:

1、从数据结构上来讲

    1.1 B+树索引

        InnoDB 是在 MySQL 5.5 之后成为默认的 MySQL 存储引擎,B+Tree 索引类型也是 MySQL 存储引擎采用最多的索引类型。

        B+Tree 是一种多叉树,叶子节点才存放数据,非叶子节点只存放索引,而且每个节点里的数据是按主键顺序存放的。每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形成一个双向链表。 

  • 高效的查找、插入和删除操作。
  • 优化的磁盘读写:B+树的结构减少了磁盘I/O操作,因为它将节点大小设置为与磁盘块相等,这减少了磁盘访问次数。
  • 支持范围查询:叶子节点的链表结构使得B+树特别适合执行范围查询,能够快速地遍历指定范围的所有值。

 1.2 Hash索引

        Memory引擎默认支持哈希索引,如果多个Hash值相同,出现哈希碰撞,那么索引就以链表方式存储。InnoDB或MyISAM存储引擎页支持Hash索引,但是需要通过伪Hash索引来实现,叫自适应Hash索引。

优点:

  • 查询速度非常快,只需一次哈希计算即可定位到相应的键值。
  • 适用于等值查询。

缺点

  • 无法支持范围查询,因为哈希索引不具备排序特性。
  • 无法进行模糊查询(例如 like 'xxx%')。
  • 内存占用较高,因为需要存储哈希值。

1.3 全文索引

Full-text索引一般使用倒排索引实现。倒排索引同B+tree索引一样,也是一种索引结构。

MySQL中InnoDB存储引擎在之前版本中是不支持全文检索的,要使用全文检索的话只能使用MySIAM存储引擎。在 MySQL 5.6.4 版本中InnoDB存储引擎才开始支持Full-text索引。

对于文本类型的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。

  • 优点
    • 用于全文搜索,支持关键词匹配。
    • 适用于模糊查询和文本内容搜索。
  • 缺点
    • 占用空间较大。
    • 不适合精确匹配

2、从物理存储上来讲

        2.1聚簇索引

        主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里,当通过聚簇索引查询的时候,不需要回表,因为这个索引中存储了这张表中所有数据。

聚簇索引的创建:

  • 如果有主键,默认会使用主键作为聚簇索引的索引键(key);
  • 如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key);
  • 在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引键(key);

        2.2 非聚簇索引 

        非聚集索引的结构和聚集索引基本相同(非叶子结点存储的都是索引指针),区别在于叶子节点存放的不是行数据而是数据主键。因此在使用非聚集索引进行查找时,需要先查找到主键值,然后再到聚集索引中进行查找。这过程叫做回表。适合单行查找和特定值查找操作。可以有多个非聚集索引。

回表查询简单来说就是通过非聚集索引查询数据时,得不到完整的数据内容,需要再次查询主键索引来获得数据内容。

所以如果使用非聚集索引后还需要使用其他字段的(包括在where条件中或者select子句中),则需要通过主键索引回表到聚集索引获取其他字段。如果是非聚集索引可以满足SQL语句的所有字段的,则被称为全覆盖索引,没有回表开销。

避免回表查询问题,创建联合索引,如根据姓名查性别,那就建立一个姓名和性别的联合索引,那么再这个联合索引中进行查询的话,有查询字段性别,此时就不用回表,这种行为成为索引覆盖。索引覆盖就是指索引的叶子节点已经包含了查询的数据,满足查询要求,没必要再回表进行查询。

3、从索引字段上来讲

        3.1 主键索引

  • 主键索引是一种特殊的唯一索引,要求索引列的值必须唯一且不可为空。
  • 每个表只能有一个主键索引,通常用于标识唯一性的列,如用户ID或订单号。

        3.2 唯一索引

  • 唯一索引要求索引列的值必须唯一,但允许包含空值。
  • 适用于需要唯一性约束的列,如邮箱地址或用户名。

        3.3普通索引

  • 普通索引是最基本的索引类型,没有特殊限制。
  • 可以在单列上创建,也可以是组合索引。
  • 适用于经常需要查询的列。

        3.4前缀索引

  • 前缀索引是指对字符类型字段的前几个字符建立的索引,而不是在整个字段上建立的索引,前缀索引可以建立在字段类型为 char、 varchar、binary、varbinary 的列上。
  • 使用前缀索引的目的是为了减少索引占用的存储空间,提升查询效率。

4、从字段数量上来讲

        4.1 单列索引

  • 单列索引是最基本的索引类型,仅对一个列进行索引。
  • 适用于经常需要查询的单个列。
  • 例如,在用户表中对年龄(age)字段建立单列索引。

        4.2联合索引

  • 联合索引由多个列组成,可以同时对多个列进行索引。
  • 适用于组合搜索,效率高于单列索引。
  • 注意选择联合索引的列顺序,最左前缀原则。

最左前缀原则

查询中的过滤条件必须从索引的最左边开始,并且不能跳过中间的列。只有当查询条件与索引的最左前缀完全匹配时,索引才能被充分利用。

比如,如果创建了一个 (a, b, c) 联合索引,如果查询条件是以下这几种,就可以匹配上联合索引:

  • where a=1;
  • where a=1 and b=2 and c=3;
  • where a=1 and b=2;

需要注意的是,因为有查询优化器,所以 a 字段在 where 子句的顺序并不重要。

但是,如果查询条件是以下这几种,因为不符合最左匹配原则,所以就无法匹配上联合索引,联合索引就会失效:

  • where b=2;
  • where c=3;
  • where b=2 and c=3;

上面这些查询条件之所以会失效,是因为(a, b, c) 联合索引,是先按 a 排序,在 a 相同的情况再按 b 排序,在 b 相同的情况再按 c 排序。所以,b 和 c 是全局无序,局部相对有序的,这样在没有遵循最左匹配原则的情况下,是无法利用到索引的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024高校建设大数据实验室的用途有哪些?

随着当前现代计算机信息技术的快速进步发展,传统的各类高校重点实验室项目建设管理模式已经难以与当前现代信息技术快速发展相相互适应,高校应用大数据重点实验室项目建设模式是高校加快培养一批创新型高校大数据专业人才的重要技术基础。与此同时,高校应用大数据重点实验室项目…

手撕LRU缓存——LinkedHashMap简易源码

题目链接:https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 原理非常简单,一个双端链表配上一个hash表。 首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰,链表尾部就是最不常用的直接…

专利:基于2D工业相机的工件目标检测及三维姿态

本发明公开了一种基于2D工业相机的工件目标检测及三维姿态判定方法,首先根据待生产或是待加工工件目标搭建其三维几何模型,并标记该几何模型制定特征点,然后对通过两个2D工业相机分别获得的现场工件目标图像进行目标检测及特征识别&#xff0…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容: 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

线程安全的集合容器

线程安全的集合容器 List集合中的线程安全的集合容器: 在旧版本中Vector是线程安全的集合容器,在JDK 1.5以后CopyOnWriteArrayList也是线程安全的集合容器,CopyOnWriteArrayList的数据结构是Object类型的数组。 CopyOnWriteArrayList是如何…

最新IE跳转Edge浏览器解决办法(2024.2.29)

最新IE跳转Edge浏览器解决办法(2024.2.29) 1.前言2. 解决方案2.1.创建快捷方式2.2.效果 3. 遗留问题 1.前言 在前几天我发布过一个关于使用卸载补丁从而解决最新的IE跳转Edge浏览器的解决方案。   但是这个方案其实存在一个BUG,例如我昨天重…

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装(可用于安装非最新的 Mac OS,系统降级,需要清除所有数据) 插入制作好的可引导安装器(U盘或者移动固态硬盘),如何制作可引导安装器将 Mac 关机将 Ma…

本地ssh连接服务器成功,而vscode连接服务器超时

解决方案,按下CTRL SHIFT P 或者 COMMAND SHIFT P,然后输入Remote kill,找到以下命令Kill VS Code Server on Host...,然后选择连接失败的服务器进行Kill,之后再次尝试连接即可。 如果还不成功。找一个能登陆的方…

ubuntu基础操作(1)-个人笔记

搜狗输入法Linux官网-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://pinyin.sogou.com/linux 1.关闭sudo密码: 终端(ctrl alt t)输入 sudo visudo 打开visudo 找到 %sudo ALL(ALL:ALL) ALL 这一行…

mount命令最新详细教程

背景 需要在设备上面,自动化运行u盘里面的脚本,并且进入一个产测模式。因此实际使用了这个mount命令,所以,写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统,即将存储设备…

PYCHARM PYSIDE6 QT 打包异常处理 no qt platform plugin could be initialized

安装有PYSIDE6的电脑 异常错误 … no qt platform plugin could be initialized … 变量名:QT_QPA_PLATFORM_PLUGIN_PATH (一个字都不能改!!) 自己环境变量值:D:\Users\topma\anaconda3\Lib\site-package…

国产航顺HK32F030M: HK32F030MJ4M6_SOP8资料

最小系统 参考资料 [1] 航顺MCU HK32F030MJ4M6-SOP8 各个文件夹简介: Boards:HK32F030xMF4P6开发板的BSP驱动代码。 Documents:HK32F030xMxx数据手册、用户手册、API手册以及HK32F030xMxx开发板原理图。 Package:HK32F030xMxx Ke…

HTML+CSS:未来属于CSS

效果演示 一个带有不同背景颜色的网格布局&#xff0c;其中一些元素可能会更大或者字体更大。 Code <main><div></div><div></div><div></div><div></div><div class"big"></div><div><…

MWC 2024丨Smart Health搭载高通Aware平台—美格发布智能健康看护解决方案,开启健康管理新体验

2月29日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;全球领先的无线通信模组及解决方案提供商——美格智能正式发布了新一代Cat.1模组SLM336Q&#xff0c;是中低速物联网应用场景的高性价比之选。本次还发布了首款搭载高通Aware™平台的智能看护解决方案MC303&#x…

Squid代理服务器配置

需求是&#xff1a;通过外网机&#xff08;跳板机&#xff09;访问内网机&#xff0c;并为内网机提供访问网络的能力。 【跳板机T】【内网机N】 公网IP&#xff1a;39.107.xx.xxx 跳板机IP&#xff1a;172.17.216.234 内网机IP&#xff1a;172.17.216.241 Squid代理服务器地址…

使用Python,maplotlib绘制树型有向层级结构图

使用Python&#xff0c;maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…

Python中reduce函数和lambda表达式的学习

reduce函数将一个数据集合&#xff08;链表&#xff0c;元组等&#xff09;中的所有数据进行下列操作&#xff1a;用传给 reduce 中的函数 function&#xff08;有两个参数&#xff09;先对集合中的第 1、2 个元素进行操作&#xff0c;得到的结果再与第三个数据用 function 函数…

基于cRIO9040 FPGA的图像处理流程

硬件准备 CompactRIO9040Basler GigE相机网线遵循GigE Vision标准的相机由高性能、多核cRIO设备支持,如cRIO-908x、cRIO-903x、cRIO-904x和cRIO-905x系列以及基于英特尔的sbRIO。 软件安装 参考:cRIO9040中NI9381模块的测试 此外,PC端需要安装VDM,VAS。 cRIO端,打开NI…

详解UDP/TCP套接字

详解UDP/TCP套接字 预备知识 理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 源IP地址&#xff1a;发送主机的IP地址。目的IP地址&#xff1a;接收主机的IP地址。 认识端口号 端口号(port)是传输层协议的内容. 端口号是一个…

NVMFS5113PLWFT1G汽车级功率MOSFET 60V 10A/64A满足AEC-Q101标准

AEC-Q101认证标准详细解读&#xff1a; AEC-Q101是一种汽车电子元件可靠性标准&#xff0c;由汽车电子委员会&#xff08;Automotive Electronics Council&#xff0c;简称AEC&#xff09;制定。该标准旨在确保在汽车环境中使用的电子元件具有足够的可靠性和耐久性。 AEC-Q10…
最新文章