【力扣数据库知识手册笔记】索引
索引
索引的优缺点
优点 |
---|
1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 |
2. 可以加快数据的检索速度(创建索引的主要原因)。 |
3. 可以加速表和表之间的连接,实现数据的参考完整性。 |
4. 可以在查询过程中,使用优化隐藏器(隐藏索引?),提高系统性能。 |
缺点 |
---|
时间上:创建和维护索引都要耗费时间; 当对数据进行增删改除时,索引也要动态的维护(降低了数据的维护速度)。 |
空间上:索引要占物理空间,如果要建立簇族索引,需要的空间更大。 |
索引的数据结构
数据库索引根据结构分类,分为B树索引、Hash索引和位图索引三种。
B树索引
又称平衡树索引,以树结构组织,有一个或者多个分支结点,分支结点又指向单级单叶结点。其中,分支结点用于遍历树,叶结点则保存真正的值和位置信息。结构如下:
m阶B树有如下特性:
- 每个结点最多m个子结点;
- 除了根结点和叶子结点外,每个结点最少有 ⌈ m 2 ⌉ \lceil \frac{m}{2} \rceil ⌈2m⌉个子结点;
- 所有的叶子结点都位于同一层;
- 每个结点都包含k个元素(关键字), ⌊ m 2 ⌋ ≤ k < m \lfloor \frac{m}{2} \rfloor \le k <m ⌊2m⌋≤k<m;
- 每个结点中的元素(关键字)从小到大排列;
- 每个元素子左结点的值,都小于等于该元素,右结点的值都大于等于该元素。
B+树索引
B+树是在B树基础上的一种优化,使其更适合实现外存储索引结构。结构如下:
m阶b+树的特性:
- 所有非叶子结点只存储关键字信息;
- 所有具体数据都存在叶子结点中;
- 所有的叶子结点包含了全部元素的信息;
- 所有叶子结点之间都有一个链指针。
Hash索引
哈希索引采用一定的哈希算法(常见哈希算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置,如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。
检索时不需要类似B+树那样从根结点到叶子结点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,平均检索时间为 O ( 1 ) O(1) O(1)。
位图索引
B树索引擅长于处理包含许多不同值的列,但是在处理基数较小的列时会变得很难使用,如只有几个固定值,如性别、婚姻状况、行政区等,要么不使用索引,要么建立位图索引。
位图索引为存储在某列中的每个值生成一个位图,例如对婚姻状况(未婚、已婚和离婚),可以生成三个向量,每个位图为每一个人都分配了0/1值,每个人三者中只存在一个1,当进行数据查找时,只需要查找相关位图中的所有1即可。
位图索引适合静态数据,不适合索引频繁更新的列。
使用B+树索引的好处
- B+树内部结点只存放键,一次读取可以在同一内存页中获取更多的键,可以更快地缩小查找范围。
- B+树的叶结点由一条链相连,因此当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)
时间找到最小结点,然后通过链进行O(N)顺序遍历即可;找数据时先找到结点,然后链表遍历。
Hash索引和B+树索引的区别
- Hash索引进行等值查询更快,但是无法进行范围查询;
- Hash索引不支持使用索引进行排序;
- Hash索引不支持模糊查询以及多列索引的最左前缀匹配(因为Hash函数不可预测);
- Hash索引任何时候都避免不了回表查询数据,而B+树在符合聚簇索引,覆盖索引等的时候可以只通过索引完成查询;
- Hash索引当某个键值存在大量重复的时候,发生Hash碰撞,此时效率可能极差;B+树的查询效率比较稳定,对于所有的查询都是从根结点到叶子结点,且树的高度较低。
什么是前缀索引?
索引开始的几个字符,而不是索引全部值,避免因为需要索引很长的字符列使得索引变大变慢,这种索引被称为前缀索引,以节约空间并得到好的性能。
建立前缀索引的前提:前缀的辨识度高(如密码)。
前缀索引需要的空间变小,但也会降低选择性(不重复的索引值/表中所有行数T,范围为1/T~1)。
高选择性的索引在查找匹配的时候可以过滤掉更多的行,唯一索引的选择率为1,为最佳值。
什么是最左前缀匹配原则?
在MySQL建立联合索引(多列索引)时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
用索引当限制条件查询时需要从左往右,连续匹配;范围查询会中断匹配,中断即止。
添加索引的原则
- 在查询中很少使用或参考的列不要创建索引。
- 只有很少数据值的列不要创建索引(区分度太低,索引不能明显加快检索速度)。
- 定义为text、image和bit数据类型的列不应该增加索引(这些数据量处于相当大和相当小两个极端)。
- 当修改性能远远大于检索性能时,不应该创建索引。
- 定义有外键的数据列一定要创建索引。
什么是聚簇索引?
- 聚簇索引,又称为聚集索引,并不是一种索引类型,而是一种数据存储方式。指的是将数据存储和索引放到一起,找到索引也就找到了数据。
MySQL里只有INNODB表支持聚簇索引,INNODB表数据本身就是聚簇索引,非叶子结点按照主键顺序存放,叶子结点存放主键以及对应的行记录。
特点:
- 索引和数据存放在一起,所以具有更高的检索效率;
- 相比于非聚簇索引,可以减少磁盘的IO数;
- 表的物理存储依据聚簇索引的结构,所以一个数据表只能有一个聚簇索引,但是可以有多个非聚簇索引;
- 会在频繁使用、排序的字段上创建聚簇索引。
- 非聚簇索引:除聚簇索引外所有索引,也是B树结构,不存储真正的数据行,只包含一个指向数据行的指针。
类型 | 定义 | 举例 |
---|---|---|
复合索引 | 一个索引包含多个列(字段)的索引。 | CREATE INDEX idx_user_name_age ON user(name, age); 表示一个同时作用在 name 和 age 字段上的索引。 |
覆盖索引 | 指某条 SQL 查询所需要的所有列都包含在某个索引中,不需要回表查询数据。 | 若查询 SELECT name, age FROM user WHERE name = 'Tom' ,并且有上面的复合索引,则这个索引就是一个覆盖索引。 |
相关文章:

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...