1-003:MySQL 的索引类型有哪些?

news2025/3/11 18:18:04

MySQL 中的索引类型主要分为以下几类,每种索引都有不同的适用场景和优化查询的作用:


1. 按存储结构分类

① 聚簇索引(Clustered Index)
  • 特点:
    • InnoDB 引擎的 主键索引 就是 聚簇索引
    • 数据与索引存储在一起,索引的叶子节点就是数据本身。
    • 每张表只能有一个聚簇索引(一般是主键)。
    • 按照主键值的物理顺序存储数据,提高主键范围查询效率。
  • 适用场景:高效的 主键查询,需要顺序存储的数据结构(如 B+ 树)。
② 非聚簇索引(Secondary Index / Non-Clustered Index)
  • 特点:
    • 普通索引、唯一索引等都属于非聚簇索引
    • 索引的叶子节点存储的是主键值,而不是数据本身。
    • 查询时需要回表查找实际数据(多了一次查询)。
    • 一个表可以有多个非聚簇索引。
  • 适用场景:非主键查询,如按姓名、邮箱等字段查询。

2. 按功能分类

① 普通索引(Index / Secondary Index)
  • 特点:

    • 最基础的索引类型,加速 WHERE 语句查询
    • 叶子节点存储的是主键值,需要回表查询数据。
  • 适用场景

    : 在 查询频繁的列(非主键)上加索引,比如 nameemail 等字段。

② 唯一索引(Unique Index)
  • 特点

    : 和普通索引类似,但索引列的值必须唯一

    • 如果定义了唯一索引,在插入数据时会进行唯一性检查。
  • 适用场景

    : 适用于 身份证号、邮箱、用户名 等字段。

③ 复合索引(Composite Index / Multi-Column Index)
  • 特点

    多个字段组成的索引,提高多条件查询效率。

    • 遵循最左匹配原则:索引的作用取决于查询语句的字段顺序。
  • 适用场景:

    • 查询涉及 多个字段,如 (name, age, city) 联合查询。
④ 全文索引(Full-Text Index)
  • 特点:
    • 用于 全文搜索,支持 MATCH() ... AGAINST() 语法。
    • 适用于 长文本字段,如 TEXTVARCHAR 字段。
  • 适用场景:
    • 适用于 文章内容、博客搜索,但一般推荐使用 Elasticsearch 进行全文检索。
⑤ 空间索引(Spatial Index,R-Tree)
  • 特点:
    • 适用于存储地理信息,支持 GIS 数据类型(如 POINTPOLYGON)。
    • 只能用于 MyISAM 引擎(InnoDB 8.0 开始支持)。
  • 适用场景:
    • 地理位置查询,如 地图应用、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 优化,正确选择索引可以显著提高查询性能!🚀

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

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

相关文章

从0开始的操作系统手搓教程24——完成我们的键盘驱动子系统

目录 所以,我们现来说说转义字符 我们需要如何处理扫描码 当键入的是双字符键时 当键入的是字母键时 下一篇 我们下面来看看我们的键盘驱动子系统是一个怎么个事情。 驱动程序,你可以认为是对硬件的一层封装。我们按照手册规格的规定姿势&#xff0…

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(); //转…

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建设框架与用户防护策略。通过理论分析与实操案…

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比&#xff0c…

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 开发小程序的下载文件功能

小程序下载文件&#xff0c;可以先预览文件内容&#xff0c;然后在手机上打开文件的工具中选择保存。 简单示例&#xff1a;&#xff08;复制到HBuilder直接食用即可&#xff09; <template><view class"container-detail"><view class"example…

blazemeter工具使用--用于自动生成jmeter脚本并进行性能测试

1、安装blazemeter&#xff08;网上有很多详情的教程&#xff09; 2、开始录制&#xff1a;设置号你的文件名称后开始录制 3、录制完成后保存为jmeter(jmx)文件 4、在jmeter中打开文件 5、添加一个后置处理器&#xff1a;查看结果树&#xff0c;后运行看看能否成功&#xf…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…

如何用HTML5 Canvas实现电子签名功能✍️

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…

表格columns拼接两个后端返回的字段(以umi框架为例)

在用组件对前端项目进行开发时&#xff0c;我们会遇到以下情况&#xff1a;项目原型中有取值范围这个表字段&#xff0c;需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值&#xff0c; 在columns中我们需要对这两个字段进行拼接&#xff0…

sparkTTS window 安装

SparkTTS 的简介 Spark-TTS是一种基于SpardAudio团队提出的 BiCodec 构建的新系统&#xff0c;BiCodec 是一种单流语音编解码器&#xff0c;可将语音策略性地分解为两种互补的标记类型&#xff1a;用于语言内容的低比特率语义标记和用于说话者特定属性的固定长度全局标记。这种…

【K8S系列】深入探究Kubernetes中查看日志的方法

在Kubernetes&#xff08;简称K8s&#xff09;的世界里&#xff0c;日志是诊断和排查问题的关键线索。无论是应用程序的运行状态、错误信息&#xff0c;还是系统的健康状况&#xff0c;都能从日志中找到蛛丝马迹。本文将详细介绍在K8s中查看日志的各种方法&#xff0c;从基础的…

JmeterHttp请求头管理出现Unsupported Media Type问题解决

JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type&#xff0c;有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…