MySQL 索引分类及区别与特点

news2025/1/7 12:59:44

MySQL 索引分类及区别与特点

索引是数据库中用于加速数据检索的数据结构。MySQL 支持多种类型的索引,每种索引有其特定的使用场景和特点。以下是 MySQL 中常见的索引分类及其区别与特点:


1. 按数据结构分类

(1) B+Tree 索引
  • 特点
    • 默认的索引类型,适用于大多数场景。
    • 支持全值匹配、范围查询和排序。
    • 数据存储在叶子节点,非叶子节点只存储索引键。
  • 适用场景
    • 等值查询(=)、范围查询(><BETWEEN)、排序(ORDER BY)。
  • 优点
    • 查询效率高,适合高基数列(唯一值多的列)。
  • 缺点
    • 对于低基数列(唯一值少的列,如性别),效率较低。
(2) Hash 索引
  • 特点
    • 基于哈希表实现,适用于等值查询。
    • 不支持范围查询和排序。
  • 适用场景
    • 等值查询(=)。
  • 优点
    • 查询速度极快,时间复杂度为 O(1)。
  • 缺点
    • 不支持范围查询和排序。
    • 哈希冲突可能影响性能。
(3) Full-Text 索引
  • 特点
    • 用于全文搜索,支持自然语言查询。
    • 基于倒排索引实现。
  • 适用场景
    • 文本字段的全文搜索(MATCH ... AGAINST)。
  • 优点
    • 支持复杂的文本搜索。
  • 缺点
    • 仅适用于文本字段,查询性能受数据量影响。
(4) R-Tree 索引
  • 特点
    • 用于空间数据查询,支持地理坐标等数据。
  • 适用场景
    • 地理空间数据查询(GIS)。
  • 优点
    • 支持空间数据的高效查询。
  • 缺点
    • 仅适用于空间数据,使用场景有限。

2. 按功能分类

(1) 主键索引(Primary Key Index)
  • 特点
    • 唯一标识表中的每一行,不允许重复和 NULL 值。
    • 默认是 B+Tree 索引。
  • 适用场景
    • 主键列。
  • 优点
    • 保证数据的唯一性,查询效率高。
  • 缺点
    • 只能有一个主键索引。
(2) 唯一索引(Unique Index)
  • 特点
    • 确保列中的值唯一,允许 NULL 值。
    • 默认是 B+Tree 索引。
  • 适用场景
    • 需要唯一性约束的列。
  • 优点
    • 保证数据的唯一性,查询效率高。
  • 缺点
    • 插入和更新时需要检查唯一性,可能影响性能。
(3) 普通索引(Normal Index)
  • 特点
    • 最基本的索引类型,没有唯一性约束。
    • 默认是 B+Tree 索引。
  • 适用场景
    • 需要加速查询的列。
  • 优点
    • 提高查询效率。
  • 缺点
    • 需要额外的存储空间。
(4) 全文索引(Full-Text Index)
  • 特点
    • 用于全文搜索,支持自然语言查询。
  • 适用场景
    • 文本字段的全文搜索。
  • 优点
    • 支持复杂的文本搜索。
  • 缺点
    • 仅适用于文本字段,查询性能受数据量影响。
(5) 组合索引(Composite Index)
  • 特点
    • 基于多个列的索引。
    • 遵循最左前缀原则。
  • 适用场景
    • 多列查询条件。
  • 优点
    • 支持多列查询,减少索引数量。
  • 缺点
    • 需要遵循最左前缀原则,否则无法使用索引。

3. 按存储方式分类

(1) 聚簇索引(Clustered Index)
  • 特点
    • 索引和数据存储在一起,表数据按索引顺序存储。
    • 每张表只能有一个聚簇索引。
    • 主键索引默认是聚簇索引。
  • 适用场景
    • 主键列。
  • 优点
    • 查询效率高,减少磁盘 I/O。
  • 缺点
    • 插入和更新时可能引起数据重排。
(2) 非聚簇索引(Non-Clustered Index)
  • 特点
    • 索引和数据分开存储,索引中存储指向数据的指针。
    • 每张表可以有多个非聚簇索引。
  • 适用场景
    • 非主键列。
  • 优点
    • 支持多个索引,灵活性高。
  • 缺点
    • 查询时需要额外的磁盘 I/O。

4. 按覆盖范围分类

(1) 覆盖索引(Covering Index)
  • 特点
    • 索引包含了查询所需的所有字段,无需回表查询。
  • 适用场景
    • 查询字段较少且固定。
  • 优点
    • 减少磁盘 I/O,提高查询效率。
  • 缺点
    • 需要额外的存储空间。
(2) 非覆盖索引(Non-Covering Index)
  • 特点
    • 索引不包含查询所需的所有字段,需要回表查询。
  • 适用场景
    • 查询字段较多或不固定。
  • 优点
    • 索引占用空间较小。
  • 缺点
    • 查询效率较低,需要额外的磁盘 I/O。

5. 按索引列数量分类

(1) 单列索引(Single-Column Index)
  • 特点
    • 基于单个列的索引。
  • 适用场景
    • 单列查询条件。
  • 优点
    • 简单易用,查询效率高。
  • 缺点
    • 仅适用于单列查询。
(2) 多列索引(Multi-Column Index)
  • 特点
    • 基于多个列的索引,遵循最左前缀原则。
  • 适用场景
    • 多列查询条件。
  • 优点
    • 支持多列查询,减少索引数量。
  • 缺点
    • 需要遵循最左前缀原则,否则无法使用索引。

总结

索引类型数据结构功能存储方式覆盖范围适用场景
B+Tree 索引B+Tree普通索引、主键索引聚簇/非聚簇覆盖/非覆盖等值查询、范围查询、排序
Hash 索引Hash普通索引非聚簇非覆盖等值查询
Full-Text 索引倒排索引全文索引非聚簇非覆盖文本字段的全文搜索
R-Tree 索引R-Tree空间索引非聚簇非覆盖地理空间数据查询
主键索引B+Tree主键索引聚簇覆盖/非覆盖主键列
唯一索引B+Tree唯一索引非聚簇覆盖/非覆盖需要唯一性约束的列
普通索引B+Tree普通索引非聚簇覆盖/非覆盖需要加速查询的列
组合索引B+Tree普通索引非聚簇覆盖/非覆盖多列查询条件

根据具体需求选择合适的索引类型,可以显著提高数据库的查询性能。

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

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

相关文章

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…

[极客大挑战 2019]HardSQL 1

看了大佬的wp&#xff0c;没用字典爆破&#xff0c;手动试出来的&#xff0c;屏蔽了常用的关键字&#xff0c;例如&#xff1a;order select union and 最搞的是&#xff0c;空格也有&#xff0c;这个空格后面让我看了好久&#xff0c;该在哪里加括号。 先传入1’ 1试试&#…

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models

1.abstract 最近推出的3D高斯飞溅(3DGS)&#xff0c;它用多达数百万个原始椭球体来描述场景&#xff0c;可以实时渲染。3DGS迅速声名鹊起。然而&#xff0c;一个关键的悬而未决的问题仍然存在&#xff1a;我们如何将多个3DG融合到一个连贯的模型中&#xff1f;解决这个问题将使…

javaEE-网络原理-1初识

目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连&#xff1a; 2.基于集线器组件&#xff1a; 3.基于交换机组件&#xff1a; 4.基于交换机和路由器组件 ​编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号&#xff1a; 3.协议 4.五…

电子电气架构 --- 整车整车网络管理浅析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

xml格式化(3):增加头部声明

前言 这篇文章&#xff0c;是用来增加头部声明。 正文 from lxml import etreedef pretty_print(element, level0, indent" "):result ""# 判断元素是否为注释节点if isinstance(element, etree._Comment):result f"{indent * level}<!--{el…

STM32 高级 物联网通讯之LoRa通讯

目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…

【FlutterDart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)

上效果 预期的是通过拖动一条边界线改变窗口大小&#xff0c;类似vscode里拖动效果。这个是简单的拖动实现 上代码&#xff1a; import package:flutter/material.dart;class MyDraggableViewDemo extends StatelessWidget {const MyDraggableViewDemo({super.key});override…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…

如何免费解锁 IPhone 网络

您是否担心 iPhone 上的网络锁定&#xff1f;如果您的 iPhone 被锁定到特定运营商&#xff0c;解锁它可以连接到不同的运营商。好吧&#xff0c;我们为您准备了一份指南。 iPhone运营商免费解锁将是小菜一碟。在我们的解锁运营商 iphone 免费指南中。我们为您提供了一份简介&am…

[读书日志]8051软核处理器设计实战(基于FPGA)第三篇:8051 keil编程配置 C语言开发流程 中断程序实例

第一篇https://blog.csdn.net/m0_74021449/article/details/144796689 第二篇https://blog.csdn.net/m0_74021449/article/details/144813103 3.8051中断与keil开发流程 3.1 keil的下载与概述 关于keil&#xff0c;大家都并不陌生&#xff0c;它是开发51单片机和ARM架构的32…

音视频-----RTSP协议 音视频编解码

流媒体协议详解&#xff1a;RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 RTP :(Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传…

Nginx代理本地exe服务http为https

Nginx代理本地exe服务http为https 下载NginxNginx命令exe服务http代理为https 下载Nginx 点击下载Nginx 下载好之后是一个压缩包&#xff0c;解压放到没有中文的路径下就可以了 Nginx命令 调出cmd窗口cd到安装路径 输入&#xff1a;nginx -v 查看版本 nginx -h&#xff…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

【Go学习】-01-6-数据库泛型新特性

【Go学习】-01-6-数据库泛型新特性 1 数据库操作1.1 操作mysql1.1.1 Insert1.1.2 Select1.1.3 Update1.1.4 Delete1.1.5 sql事务 1.2 go操作Redis 2 泛型2.1 非泛型函数2.2 泛型函数2.3 泛型类型2.3.1 泛型结构体2.3.2 泛型接口 2.4 泛型约束2.5 泛型切片和映射2.5.1 泛型切片2…

STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路 我们先检测下降沿信号&#xff0c;检测到以后&#xff0c;在回调函数里切换成检测上升沿信号&#xff0c;当两个信号都检测到的时候&#xff0c;这段时间就是按键按下的时间&#xff0c;如图所示&#xff1a;>N*(ARR1)CCRx的值 N是在这段时间内&…

【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…