MySQL 索引分类及区别与特点
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 | 普通索引 | 非聚簇 | 覆盖/非覆盖 | 多列查询条件 |
根据具体需求选择合适的索引类型,可以显著提高数据库的查询性能。
相关文章:
MySQL 索引分类及区别与特点
MySQL 索引分类及区别与特点 索引是数据库中用于加速数据检索的数据结构。MySQL 支持多种类型的索引,每种索引有其特定的使用场景和特点。以下是 MySQL 中常见的索引分类及其区别与特点: 1. 按数据结构分类 (1) BTree 索引 特点: 默认的索…...
对中文乱码的理解,遇到乱码该怎么办。
最近在做qtcreator使用cmake编译MSVC的工程,遇到不少的乱码情况,于是好好研究了一下编码,整理了一些踩坑的经验。 一、中文乱码的来源 目前常见到的中文编码其实就两种,UTF8和GBK。 我们遇到的绝大多数乱码,就是系统…...
《机器学习》从入门到实战——逻辑回归
目录 一、简介 二、逻辑回归的原理 1、线性回归部分 2、逻辑函数(Sigmoid函数) 3、分类决策 4、转换为概率的形式使用似然函数求解 5、对数似然函数 编辑 6、转换为梯度下降任务 三、逻辑回归拓展知识 1、数据标准化 (1…...
svn不能添加.a文件
解决办法 在home目录下有一个.subversion文件夹,文件夹内有个config文件,里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore,这样就会不顾config中的规则,将指定路径的文件都添加到版本库中 rockyrocky:/e…...
23.Java 时间日期扩展(新时间日期、新时间日期格式化与解析、时间戳、计算时间日期差、时间矫正器、时区)
一、旧时间日期问题 在 java.util 和 java.sql 包下都有时间日期类 java.util.Date 类包含时间和日期 java.sql.Date 类值包含日期 java.util.Date 类线程不安全,Date 对象可变 时间日期格式化类在 java.text 包下 时区处理困难,并不支持国际化&…...
C语言渗透和好网站
渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…...
mysql系列7—Innodb的redolog
背景 本文涉及的内容较为底层,做了解即可,是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过:数据和索引保存在磁盘上…...
静态时序分析:线负载模型的选择机制
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 线负载模型及其选择 线负载模型仅在Design Compiler线负载模式(非拓扑模式)下时使用,它估算了导线长度和扇出对网线的电阻、电容和面积的影响ÿ…...
git 中 工作目录 和 暂存区 的区别理解
比喻解释 可以把工作目录和暂存区想象成两个篮子: 工作目录是你把所有东西(文件和更改)扔进去的地方。你正在修改的东西都放在这里。暂存区则是你整理好的东西放进第二个篮子,准备提交给老板(提交到仓库)…...
C++ 变量:深入理解与应用
C 变量:深入理解与应用 一、引言 C作为一种强大且广泛应用的编程语言,变量是其程序设计的基础构建块之一。变量允许我们在程序中存储、操作和访问数据,对于实现各种复杂的功能至关重要。正确地理解和使用变量,能够编写出高效、可…...
http报头解析
http报文 http报文主要有两类是常见的,第一类是请求报文,第二类是响应报文,每个报头除了第一行,都是采用键值对进行传输数据,请求报文的第一行主要包括http方法(GET,PUT, POST&#…...
数据库的概念和操作
目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...
《XML Schema 字符串数据类型》
《XML Schema 字符串数据类型》 1. 引言 XML Schema 是一种用于描述和验证 XML 文档结构和内容的语言。在 XML Schema 中,字符串数据类型是一种基本的数据类型,用于表示文本数据。本文将详细介绍 XML Schema 中的字符串数据类型,包括其定义…...
idea 开发Gradle 项目
在Mac上安装完Gradle后,可以在IntelliJ IDEA中配置并使用Gradle进行项目构建和管理。以下是详细的配置和使用指南: 1. 验证Gradle是否已安装 在终端运行以下命令,确保Gradle安装成功: gradle -v如果输出Gradle版本信息ÿ…...
Keepalived + LVS 搭建高可用负载均衡及支持 Websocket 长连接
一、项目概述 本教程旨在助力您搭建一个基于 Keepalived 和 LVS(Linux Virtual Server)的高可用负载均衡环境,同时使其完美适配 Websocket 长连接场景,确保您的 Web 应用能够高效、稳定地运行,从容应对高并发访问&…...
产品经理2025年展望
产品经理作为连接技术、设计与市场需求的桥梁,在快速变化的商业环境中扮演着至关重要的角色。展望2025年,随着技术的不断进步和消费者需求的日益多样化,产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用: 到…...
【信息系统项目管理师】第14章:项目沟通管理过程详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划沟通管理1、输入2、工具与技术3、输出二、管理沟通1、输入2、工具与技术3、输出三、监督沟通1、输入2、工具与技术3、输出一、规划沟通管理 定义:规划沟通管理是基于每个干系人或干系人群体的信息需求…...
串口DMA接收数据基本思路
串口DMA接收基本思路 串口DMA接收数据基本思路一、串口处理使用背景及常用处理方法二、串口DMA接收相关思路三、串口DMA发送相关思路 串口DMA接收数据基本思路 一、串口处理使用背景及常用处理方法 单片机经常有串口处理大量数据的场景,常用的串口处理数据方式有如…...
数据结构复习 (二叉查找树,高度平衡树AVL)
1.二叉查找树: 为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的 定义: 二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,其各结点关键词互异,且中根序列按其关键词递增排列。 等价描述: 二叉查找…...
FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境)
FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境) 0、界面预览1、部署WSL1.1 安装WSL1.2 安装Windows Terminal1.3 安装WSL配置工具 2、安装Ubuntu24.043、安装FreeSWITCH4、登录Web4.1 80端口占用了 5、测试6、卸载 0、界面预览…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
