当前位置: 首页 > news >正文

MySQL索引和其底层数据结构介绍

索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。就像是书的目录,能帮助读者快速找到所需内容。
下面从索引的类型、优缺点、创建和使用等方面详细介绍:

  1. 索引类型
    • 普通索引:最基本的索引类型,没有唯一性限制。它可以加速对数据的查询操作。在MySQL中,使用CREATE INDEX语句创建普通索引,例如:CREATE INDEX idx_name ON table_name (column_name);,这就在table_name表的column_name列上创建了名为idx_name的普通索引。
    • 唯一索引:该索引要求索引列的值必须唯一,但允许有空值。创建唯一索引可以确保数据的唯一性约束。创建语句如:CREATE UNIQUE INDEX idx_unique ON table_name (column_name);
    • 主键索引:特殊的唯一索引,用于唯一标识表中的每一行记录,不允许有空值。在创建表时,可以指定主键索引,例如:CREATE TABLE table_name (id INT PRIMARY KEY, column1 VARCHAR(255)); ,这里的id列就是主键索引。
    • 全文索引:主要用于在文本类型的列中进行全文搜索。MySQL的全文索引支持InnoDB和MyISAM存储引擎。例如:CREATE FULLTEXT INDEX idx_fulltext ON table_name (text_column);,在table_name表的text_column列上创建全文索引。不过,全文索引的使用场景相对较少,且性能优化需要谨慎处理。
    • 组合索引:也叫复合索引,是在多个列上创建的索引。使用组合索引时,需要注意列的顺序,遵循最左前缀原则。例如:CREATE INDEX idx_multiple ON table_name (column1, column2, column3); ,这是在table_name表的column1column2column3列上创建的组合索引。在查询时,如果条件包含column1,或者同时包含column1column2等,该组合索引都可能被使用。
  2. 索引的优点
    • 提高查询效率:大大减少了数据库查询时需要扫描的数据量,加快数据检索速度,提升查询性能。比如在一个有大量用户数据的表中,通过对user_id列建立索引,根据user_id查询用户信息时,能快速定位到对应记录,而不用全表扫描。
    • 保证数据唯一性:唯一索引和主键索引能确保特定列或列组合的值在表中是唯一的,维护了数据的完整性和一致性。
    • 实现表与表之间的关联:在多表关联查询时,索引可以加快表之间的连接速度。外键约束通常借助索引来提高查询性能,使得关联查询更加高效。
  3. 索引的缺点
    • 占用存储空间:索引本身需要占用一定的磁盘空间,随着数据量的增加,索引占用的空间也会增大。在高并发写入场景下,索引维护会产生额外的I/O开销,影响写入性能。
    • 影响更新性能:当对表中的数据进行插入、更新或删除操作时,数据库不仅要更新数据本身,还要更新相应的索引,这会增加操作的时间成本,降低数据更新的效率。
  4. 索引的创建原则
    • 选择合适的列:在经常用于查询条件、排序、连接操作的列上创建索引。例如,在WHERE子句、ORDER BY子句、JOIN操作涉及的列上。
    • 避免过度索引:创建过多索引会增加存储和维护成本,降低写入性能。只有在必要的情况下才创建索引,权衡查询和更新操作的性能。
    • 注意列顺序(组合索引):对于组合索引,将选择性高(基数大,即列中不同值的数量多)的列放在前面,遵循最左前缀原则,以提高索引的使用效率。
  5. 查看和删除索引
    • 查看索引:可以使用SHOW INDEX FROM table_name;语句查看指定表上的索引信息,包括索引名称、索引类型、涉及的列等。
    • 删除索引:使用DROP INDEX index_name ON table_name;语句删除指定表上的索引。在删除索引时要谨慎,确保不会对查询性能产生负面影响。

MySQL索引的底层主要使用了B-Tree(B树)、B+Tree(B+树)和哈希表(Hash)这几种数据结构,不同的存储引擎支持的索引结构有所不同,以下是详细介绍:

B-Tree(B树)

  • 结构特点
    • B树是一种自平衡的多路搜索树,它的每个节点可以有多个子节点。每个节点包含多个键值和指向子节点的指针。
    • 所有叶子节点位于同一层,这保证了查询的稳定性,无论查找哪个键值,所需的磁盘I/O次数大致相同。
    • 节点中的键值按升序排列,左子树的所有键值小于当前节点的键值,右子树的所有键值大于当前节点的键值。
  • 在MySQL中的应用
    • 早期的MyISAM存储引擎在实现索引时采用过B树结构。在B树索引中,每个节点既存储键值,也存储对应的数据记录指针。
    • 当进行范围查询时,B树需要在多个节点之间进行遍历,可能会涉及较多的磁盘I/O操作,效率相对较低。

B+Tree(B+树)

  • 结构特点
    • B+树是B树的一种变体,同样是自平衡的多路搜索树。它的非叶子节点只存储键值和指向子节点的指针,不存储数据记录指针;而叶子节点存储了所有的数据记录指针,并且叶子节点之间通过指针相连,形成一个有序链表。
    • 所有的数据查询最终都要访问到叶子节点,因此查询的时间复杂度是固定的,为O(log n),其中n是节点数量。
  • 在MySQL中的应用
    • InnoDB和MyISAM存储引擎主要使用B+树作为索引的底层数据结构。在InnoDB中,主键索引(聚簇索引)的叶子节点存储了完整的数据记录,而辅助索引的叶子节点存储的是主键值,通过主键值再去主键索引中查找完整数据。
    • 由于B+树的叶子节点之间有指针相连,非常适合范围查询。在进行范围查询时,可以沿着叶子节点的链表顺序访问,减少了磁盘I/O次数,提高了查询效率。

B树和B+树的主要区别在于
B树的非叶子节点和叶子节点都存放数据,而B+树的所有数据只出现在叶子节点,这使得B+树在查询时效率更稳定。
B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。

哈希表(Hash)

  • 结构特点
    • 哈希表是一种根据键值直接访问内存存储位置的数据结构,通过哈希函数将键值映射到一个固定大小的数组索引上。
    • 哈希表的查找、插入和删除操作的平均时间复杂度为O(1),效率非常高。
  • 在MySQL中的应用
    • Memory存储引擎支持哈希索引。哈希索引适用于等值查询,例如WHERE column = value这种类型的查询。
    • 哈希索引的缺点是不支持范围查询,因为哈希函数将键值映射到不同的位置,无法直接根据键值的大小关系进行范围查找。同时,哈希冲突的处理会增加额外的开销。

综上所述,B+树由于其适合范围查询和有序遍历的特点,成为了MySQL中最常用的索引底层数据结构,而哈希索引则在特定的等值查询场景中发挥作用。

其他索引相关问题:

什么是聚簇索引什么是非聚簇索引?
聚簇索引是指数据与索引放在一起,B+树的叶子节点保存了整行数据,通常只有一个聚簇索引,一般是由主键构成。
非聚簇索引则是数据与索引分开存储,B+树的叶子节点保存的是主键值,可以有多个非聚簇索引,通常我们自定义的索引都是非聚簇索引。

什么是回表查询吗?
回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应的整行数据的过程。

什么叫覆盖索引吗?
覆盖索引是指在SELECT查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

MySQL超大分页怎么处理?
超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的数据,因为查询ID时使用的是覆盖索引,所以效率可以提升。

索引创建原则有哪些?
创建索引的原则包括:
表中的数据量超过10万以上时考虑创建索引。
选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。
尽量使用复合索引,覆盖SQL的返回值。
如果字段区分度不高,可以将其放在组合索引的后面。
对于内容较长的字段,考虑使用前缀索引。
控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。

什么情况下索引会失效?
索引可能在以下情况下失效:
没有遵循最左匹配原则。
使用了模糊查询且%号在前面。
在索引字段上进行了运算或类型转换。
使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。

相关文章:

MySQL索引和其底层数据结构介绍

索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。就像是书的目录&…...

No module named ‘posepile.util‘

目录 No module named posepile.util 解决方法: No module named posepile.util 错误代码: import posepile.datasets3d as ds3d pip install git+https://github.com/isarandi/PosePile.git. And then, I executed the following command, " python -m metrabs_py…...

SQL布尔盲注、时间盲注

一、布尔盲注 布尔盲注(Boolean-based Blind SQL Injection)是一种SQL注入技术,用于在应用程序不直接显示数据库查询结果的情况下,通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…...

RocketMQ与kafka如何解决消息丢失问题?

0 前言 消息丢失基本是分布式MQ中需要解决问题,消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时,在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…...

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...

【Vue3 入门到实战】14. telePort 和 Suspense组件

目录 ​编辑 1. telePort 2. 异步组件Suspense 3. 总结 1. telePort telePort 允许你将子组件渲染到 DOM 中的任何位置,而不仅仅是在其父组件的范围内。这对于模态框(modals)、提示框(tooltips)和其他需要脱…...

Golang的并发编程案例详解

Golang的并发编程案例详解 一、并发编程概述 并发编程是指程序中有多个独立的执行线索,并且这些线索在时间上是重叠的。在 Golang 中,并发是其核心特性之一,通过 goroutine 和 channel 来支持并发编程,使得程序可以更高效地利用计…...

IS-IS 泛洪机制 | LSP 处理流程

IS-IS 泛洪机制 作为一种链路状态路由协议,IS-IS 与 OSPF 类似,在学习和计算路由之前,区域中的路由器首先需交换链路状态信息,最终使所有路由器的链路状态数据库达到一致状态,这就如同每台路由器都拥有一张相同的网络…...

原型模式详解(Java)

原型模式(Prototype Pattern),作为一种极具代表性的创建型设计模式,其核心思想在于通过复制,亦即克隆现有的对象,来达成创建新对象的目的,而非依赖传统的构造函数途径。这一模式巧妙地基于现有对…...

内存条2R×4 2400和4R×4 2133的性能差异

内存条2R4 2400和4R4 2133的性能差异 2R4 2400 和 4R4 2133 是两种不同的内存条规格,主要在Rank数量和频率上有所不同,具体性能差异如下: 1. Rank数量 2R4:表示内存条有2个Rank,每个Rank有4个内存芯片。4R4&#xff…...

安装并配置 MySQL

MySQL 是世界上最流行的开源关系型数据库管理系统之一,因其高性能、可靠性和易用性而被广泛应用于各种规模的企业级应用中。本文将详细介绍如何在不同的操作系统上安装和配置 MySQL,帮助你快速搭建起一个功能完善的数据库环境。 选择适合你的安装方式 …...

常用的网络安全设备

一、 WAF 应用防火墙 范围:应用层防护软件 作用: 通过特征提取和分块检索技术进行模式匹配来达到过滤,分析,校验网络请求包的目的,在保证正常网络应用功能的同时,隔绝或者阻断无效或者非法的攻击请求 可…...

【蓝桥】线性DP--最快洗车时间

题目描述​ 解题思路 完整代码 举例 总结 基于 0/1 背包思想 解决 洗车时间分配问题,本质上是子集和问题【给定一个 正整数数组 nums 和一个目标值 target,判断是否可以从 nums 选择 若干个数(每个数最多选一次),使…...

Spring Boot比Spring多哪些注解?

Spring Boot 相比 Spring 多了很多自动化配置和简化开发的注解,主要包括以下几类: Spring Boot 启动与自动配置相关Spring Boot 配置相关Spring Boot Web 相关Spring Boot 测试相关Spring Boot 条件装配相关Spring Boot 监控与 Actuator 相关 1. Spring…...

springboot021校园周边美食探索及分享平台

版权声明 所有作品均为本人原创,提供参考学习使用,如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言:Javavue。 框架:后端spingboot前端vue。 模式:B/S。 数据库:mysql。 开…...

【网络通信】传输层之UDP协议

【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …...

Python环境搭建与量化交易开发:从基础到实战

Python环境搭建与量化交易开发:从基础到实战 在量化交易领域,Python因其强大的数据处理能力和丰富的库支持而成为首选编程语言。本文将指导您如何在本地搭建一个适合量化交易的Python环境,并介绍一些实用的工具和技巧。 《QMT开通规则分享》…...

软著申请(六)软著返修流程【2025年最新版】

软著申请(六)软著返修流程【2025年最新版】 一、软著返修流程1、软著返修流程须知2、相关细节二、针对大模型特殊补正条件三、备注本服务提供详细的软件著作权申请流程指导。申请人严格按照指导步骤完成申请,若最终未能成功获得著作权登记,可联系服务提供方进行免费咨询和指…...

SOUI基于Zint生成Code11码

Code 11 是一种高密度的数字条形码,主要用于标识电信设备和电子元件。它的名称来源于其能够编码 11 种字符:数字 0-9 和连接符 -。Code 11 是一种双向可读的条形码,支持校验位以提高数据准确性。 在使用BARCODE_CODE11码制生成code 11码时可指…...

sqlilabs第八关

?id1 and sleep(2)-- 发现页面存在注点,使用时间盲注脚本进行注入--- import requestsdef inject_database(url):name #name用于存储猜测出的数据库名称 for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...