1-003:MySQL 的索引类型有哪些?
MySQL 中的索引类型主要分为以下几类,每种索引都有不同的适用场景和优化查询的作用:
1. 按存储结构分类
① 聚簇索引(Clustered Index)
- 特点:
- InnoDB 引擎的 主键索引 就是 聚簇索引。
- 数据与索引存储在一起,索引的叶子节点就是数据本身。
- 每张表只能有一个聚簇索引(一般是主键)。
- 按照主键值的物理顺序存储数据,提高主键范围查询效率。
- 适用场景:高效的 主键查询,需要顺序存储的数据结构(如 B+ 树)。
② 非聚簇索引(Secondary Index / Non-Clustered Index)
- 特点:
- 普通索引、唯一索引等都属于非聚簇索引。
- 索引的叶子节点存储的是主键值,而不是数据本身。
- 查询时需要回表查找实际数据(多了一次查询)。
- 一个表可以有多个非聚簇索引。
- 适用场景:非主键查询,如按姓名、邮箱等字段查询。
2. 按功能分类
① 普通索引(Index / Secondary Index)
-
特点:
- 最基础的索引类型,加速 WHERE 语句查询。
- 叶子节点存储的是主键值,需要回表查询数据。
-
适用场景
: 在 查询频繁的列(非主键)上加索引,比如
name、email等字段。
② 唯一索引(Unique Index)
-
特点
: 和普通索引类似,但索引列的值必须唯一。
- 如果定义了唯一索引,在插入数据时会进行唯一性检查。
-
适用场景
: 适用于 身份证号、邮箱、用户名 等字段。
③ 复合索引(Composite Index / Multi-Column Index)
-
特点
: 多个字段组成的索引,提高多条件查询效率。
- 遵循最左匹配原则:索引的作用取决于查询语句的字段顺序。
-
适用场景:
- 查询涉及 多个字段,如
(name, age, city)联合查询。
- 查询涉及 多个字段,如
④ 全文索引(Full-Text Index)
- 特点:
- 用于 全文搜索,支持
MATCH() ... AGAINST()语法。 - 适用于 长文本字段,如
TEXT或VARCHAR字段。
- 用于 全文搜索,支持
- 适用场景:
- 适用于 文章内容、博客搜索,但一般推荐使用 Elasticsearch 进行全文检索。
⑤ 空间索引(Spatial Index,R-Tree)
- 特点:
- 适用于存储地理信息,支持 GIS 数据类型(如
POINT、POLYGON)。 - 只能用于
MyISAM引擎(InnoDB 8.0 开始支持)。
- 适用于存储地理信息,支持 GIS 数据类型(如
- 适用场景:
- 地理位置查询,如 地图应用、LBS(基于位置的服务)。
3. 按物理存储方式分类
① B+ 树索引(B+Tree Index)
- MySQL 默认索引(InnoDB 使用 B+ 树)。
- 适用于 大部分查询,如主键查询、范围查询、排序查询。
② 哈希索引(Hash Index)
- 仅适用于 等值查询,不支持范围查询、排序查询。
- Memory 引擎默认使用哈希索引。
③ R-Tree 索引(R-Tree Index)
- 用于 地理空间数据(如坐标、地图数据)。
- 适用于 地理范围查询(如查找某个范围内的地点)。
总结:如何选择合适的索引?
| 索引类型 | 特点 | 适用场景 |
|---|---|---|
| 聚簇索引 | 数据存储与索引结合,提高主键查询效率 | 主键查询、顺序存储 |
| 非聚簇索引 | 叶子节点存主键值,查询需回表 | 非主键查询、普通索引 |
| 普通索引 | 加速查询,但不保证唯一性 | 高频查询字段 |
| 唯一索引 | 索引列值必须唯一 | 身份证号、邮箱 |
| 复合索引 | 多列联合索引,最左匹配原则 | 多个条件联合查询 |
| 全文索引 | 支持全文搜索 | 文章、博客内容检索 |
| 空间索引 | 适用于地理信息查询 | 地图、LBS 应用 |
4. 图解
MySQL 索引类型
│
├── **按存储结构分类**
│ ├── 聚簇索引(Clustered Index)
│ │ ├── 主键索引
│ │ ├── 数据与索引存储在一起
│ │ ├── 物理存储按索引排序
│ │ ├── 每张表只能有一个
│ │ ├── 适用于 **主键查询、高效范围查询**
│ │
│ ├── 非聚簇索引(Secondary Index / Non-Clustered Index)
│ ├── 普通索引、唯一索引等属于非聚簇索引
│ ├── 叶子节点存储的是主键值,需要回表查询
│ ├── 一个表可以有多个非聚簇索引
│ ├── 适用于 **非主键查询**
│
├── **按功能分类**
│ ├── 普通索引(Index)
│ │ ├── 最常见的索引类型
│ │ ├── 加速 `WHERE` 条件查询
│ │ ├── 适用于 **高频查询字段**
│ │
│ ├── 唯一索引(Unique Index)
│ │ ├── 确保列值唯一
│ │ ├── 插入时进行唯一性检查
│ │ ├── 适用于 **身份证号、邮箱、用户名**
│ │
│ ├── 复合索引(Composite Index)
│ │ ├── 由多个列组成的索引
│ │ ├── 遵循 **最左匹配原则**
│ │ ├── 适用于 **多个条件联合查询**
│ │
│ ├── 全文索引(Full-Text Index)
│ │ ├── 用于 **全文搜索**
│ │ ├── 适用于 **长文本字段**
│ │ ├── 需要 `MATCH() ... AGAINST()`
│ │ ├── 适用于 **文章、博客搜索**
│ │
│ ├── 空间索引(Spatial Index)
│ ├── 适用于 **GIS(地理信息系统)**
│ ├── 仅支持 `MyISAM`(InnoDB 8.0+ 支持)
│ ├── 适用于 **地图、LBS(基于位置的服务)**
│
├── **按物理存储方式分类**
│ ├── B+ 树索引(B+Tree Index)
│ │ ├── **MySQL 默认索引结构**
│ │ ├── 适用于 **大部分查询**
│ │
│ ├── 哈希索引(Hash Index)
│ │ ├── 仅适用于 **等值查询**
│ │ ├── 适用于 **Memory 引擎**
│ │
│ ├── R-Tree 索引(R-Tree Index)
│ ├── 用于 **地理空间数据**
│ ├── 适用于 **范围查询**
│
└── **索引的选择建议**├── **普通查询** → 普通索引├── **唯一性约束** → 唯一索引├── **多字段联合查询** → 复合索引├── **全文搜索** → 全文索引├── **地理信息** → 空间索引├── **主键查询** → 聚簇索引├── **高并发等值查询** → 哈希索引
5. 结论
- 普通查询: 使用 普通索引(Index)
- 唯一性约束: 使用 唯一索引(Unique Index)
- 多字段联合查询: 使用 复合索引
- 全文搜索: 使用 全文索引
- 地理信息: 使用 空间索引
- 主键查询: 依赖 聚簇索引
- 高并发等值查询(如缓存表): 使用 哈希索引
如果你的业务涉及大数据查询、复杂 SQL 优化,正确选择索引可以显著提高查询性能!🚀
相关文章:
1-003:MySQL 的索引类型有哪些?
MySQL 中的索引类型主要分为以下几类,每种索引都有不同的适用场景和优化查询的作用: 1. 按存储结构分类 ① 聚簇索引(Clustered Index) 特点: InnoDB 引擎的 主键索引 就是 聚簇索引。数据与索引存储在一起ÿ…...
从0开始的操作系统手搓教程24——完成我们的键盘驱动子系统
目录 所以,我们现来说说转义字符 我们需要如何处理扫描码 当键入的是双字符键时 当键入的是字母键时 下一篇 我们下面来看看我们的键盘驱动子系统是一个怎么个事情。 驱动程序,你可以认为是对硬件的一层封装。我们按照手册规格的规定姿势࿰…...
git大文件传输报错
简述 git传输大于25M的文件时会报错,需要使用 Git LFS进行文件传输。 Git LFS(Large File Storage)是 GitHub 推荐的方式,可以管理大文件而不会影响 Git 性能。 操作流程 # 安装 Git LFS git lfs install# 将 PDF 文件添加到 G…...
基础玩转物联网-4G模块如何快速实现与MQTT服务器通信
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 连接MQTT服务器 3.1 创建MQTT监听Topic 3.2 打开配置工具读取基本信息 3.3 设置连接参数进行数据交互 4 总结 1 前言 MQTT(Message Queuing Telemetry Transport)是一种轻…...
使用Beanshell前置处理器对Jmeter的请求body进行加密
这里我们用HmacSHA256来进行加密举例: 步骤: 1.先获取请求参数并对请求参数进行处理(处理成String类型) //处理请求参数的两种方法: //方法一: //获取请求 Arguments args sampler.getArguments(); //转…...
Python入门3:类与面对对象
目录 类 一、类的概念 二、类的定义和使用 2.1 类的定义 2.2 实例化对象 三、类的属性和方法 3.1 属性 属性的类型: 补充--私有属性 属性的操作: 3.2 方法 方法的类型: 补充--私有方法 方法的操作 四、面对过程和面对对象 …...
mac本地部署Qwq-32b记录
导语 昨天看到阿里开源了Qwq-32b,号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下,使用ollma进行了部署,效果感觉还不错,特此记录。 环境 硬件 型号:Macbook M1 Pro 14寸内存:512G 环境…...
【病毒分析】熊猫烧香病毒分析及其查杀修复
目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …...
【语料数据爬虫】Python实现将Json语料数据转换成Word文档
前言 本文是该专栏的第1篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 本专栏为笔者精心推出的“语料数据”爬虫专栏,特别适合需要写作素材的同学,该专栏文章以采集最新的“语料数据”为主,最终篇幅将涵盖【百万级语料数据】库。 值得一提的是,…...
警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南
摘要 当前AI大模型虽展现强大能力,但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性,揭示医疗诊断、法律决策等8类禁用场景,提出可信AI建设框架与用户防护策略。通过理论分析与实操案…...
做到哪一步才算精通SQL
做到哪一步才算精通SQL-Structured Query Language 数据定义语言 DDL for StructCREATE:用来创建数据库、表、索引等对象ALTER:用来修改已存在的数据库对象DROP:用来删除整个数据库或者数据库中的表TRUNCATE:用来删除表中所有的行…...
leetcode454 四数相加
四数相加Ⅱ的解法可以将四数分为两组,即“分组 哈希”: 初始化哈希表。 分组:nums1 和 nums2 一组,nums3 和 nums4 一组。 分别对 nums1 和 nums2 进行遍历,将所有 nums1 和 nums2 的值的和作为哈希表的 key&#x…...
RoboVQA:机器人多模态长范围推理
23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比,…...
C 语言数据结构(二):顺序表和链表
目录 1. 线性表 2. 顺序表 2.1 概念及结构 2.1.1 静态顺序表(不常用) 2.1.2 动态顺序表(常用) 编辑 2.2 练习 2.2.1 移除元素 2.2.2 删除有序数组中的重复项 2.2.3 合并两个有序数组 2.3 顺序表存在的问题 3. 链表 …...
无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战
文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…...
uniapp+Vue3 开发小程序的下载文件功能
小程序下载文件,可以先预览文件内容,然后在手机上打开文件的工具中选择保存。 简单示例:(复制到HBuilder直接食用即可) <template><view class"container-detail"><view class"example…...
blazemeter工具使用--用于自动生成jmeter脚本并进行性能测试
1、安装blazemeter(网上有很多详情的教程) 2、开始录制:设置号你的文件名称后开始录制 3、录制完成后保存为jmeter(jmx)文件 4、在jmeter中打开文件 5、添加一个后置处理器:查看结果树,后运行看看能否成功…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-7.2.2自动扩缩容策略(基于HPA)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 7.2.2 基于HPA的Elasticsearch自动扩缩容深度实践1. 云原生时代弹性伸缩的核心价值1.1 业务负载特征分析1.2 传统扩缩容方式的局限性 2. HPA核心机制深度解析2.1 HPA工作原理…...
通义万相2.1:开启视频生成新时代
文章摘要:通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具,它通过核心技术的升级和创新,为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…...
如何用HTML5 Canvas实现电子签名功能✍️
🤖 作者简介:水煮白菜王,一位资深前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&a…...
区块链中的数字签名:安全性与可信度的核心
数字签名是区块链技术的信任基石,它像区块链世界的身份证和防伪标签,确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言,带你彻底搞懂区块链中的数字签名! 文章目录 1. 数字签名是什么?从现实世界到区块…...
RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)
RabbitMQ高级特性 RabbitMQ 高级特性解析:RabbitMQ 消息可靠性保障 (上)-CSDN博客 RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)-CSDN博客 引言 RabbitMQ 作为一款强大的消息队列中间件ÿ…...
表格columns拼接两个后端返回的字段(以umi框架为例)
在用组件对前端项目进行开发时,我们会遇到以下情况:项目原型中有取值范围这个表字段,需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值, 在columns中我们需要对这两个字段进行拼接࿰…...
sparkTTS window 安装
SparkTTS 的简介 Spark-TTS是一种基于SpardAudio团队提出的 BiCodec 构建的新系统,BiCodec 是一种单流语音编解码器,可将语音策略性地分解为两种互补的标记类型:用于语言内容的低比特率语义标记和用于说话者特定属性的固定长度全局标记。这种…...
【K8S系列】深入探究Kubernetes中查看日志的方法
在Kubernetes(简称K8s)的世界里,日志是诊断和排查问题的关键线索。无论是应用程序的运行状态、错误信息,还是系统的健康状况,都能从日志中找到蛛丝马迹。本文将详细介绍在K8s中查看日志的各种方法,从基础的…...
How to install nodejs with nvm on Linux mint 22.1
nvm是nodejs官方用于管理nodejs多版本环境的一个工具 ,今天,我带领大家基于nvm完成nodejs在Linux mint 22.1上的安装。 考虑到Linux mint 22.1是基于ubuntu 24.04.1 LTS的,所以,这里的安装也完全适用于nodejs在nodejs上的安装。 …...
JmeterHttp请求头管理出现Unsupported Media Type问题解决
JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type,有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…...
十大数据科学Python库
十大数据科学Python库 1、NumPy:脊髓2、Pandas:数据操纵专家3、Matplotlib:艺术之魂4、Scikit-Learn:瑞士军刀5、TensorFlow:聪明的家伙6、PyTorch:叛逆者7、Selenium:操纵大师8、NLTKÿ…...
LabVIEW伺服阀高频振动测试
在伺服阀高频振动测试中,闭环控制系统的实时性与稳定性至关重要。针对用户提出的1kHz控制频率需求及Windows平台兼容性问题,本文重点分析NI PCIe-7842R实时扩展卡的功能与局限性,并提供其他替代方案的综合对比,以帮助用户选择适合…...
解决asp.net mvc发布到iis下安全问题
解决asp.net mvc发布到iis下安全问题 环境信息1.The web/application server is leaking version information via the "Server" HTTP response2.确保您的Web服务器、应用程序服务器、负载均衡器等已配置为强制执行Strict-Transport-Security。3.在HTML提交表单中找不…...
