【力扣数据库知识手册笔记】索引

news2025/6/13 1:43:25

索引

索引的优缺点

优点
1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2. 可以加快数据的检索速度(创建索引的主要原因)。
3. 可以加速表和表之间的连接,实现数据的参考完整性。
4. 可以在查询过程中,使用优化隐藏器(隐藏索引?),提高系统性能。
缺点
时间上:创建和维护索引都要耗费时间;
当对数据进行增删改除时,索引也要动态的维护(降低了数据的维护速度)。
空间上:索引要占物理空间,如果要建立簇族索引,需要的空间更大。

索引的数据结构

数据库索引根据结构分类,分为B树索引、Hash索引和位图索引三种。

B树索引

又称平衡树索引,以树结构组织,有一个或者多个分支结点,分支结点又指向单级单叶结点。其中,分支结点用于遍历树,叶结点则保存真正的值和位置信息。结构如下:
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 2mk<m
  • 每个结点中的元素(关键字)从小到大排列;
  • 每个元素子左结点的值,都小于等于该元素,右结点的值都大于等于该元素。

B+树索引

B+树是在B树基础上的一种优化,使其更适合实现外存储索引结构。结构如下:
b+树索引结构
m阶b+树的特性:

  • 所有非叶子结点只存储关键字信息;
  • 所有具体数据都存在叶子结点中;
  • 所有的叶子结点包含了全部元素的信息;
  • 所有叶子结点之间都有一个链指针。

Hash索引

哈希索引采用一定的哈希算法(常见哈希算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置,如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。
检索时不需要类似B+树那样从根结点到叶子结点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,平均检索时间为 O ( 1 ) O(1) O(1)

位图索引

B树索引擅长于处理包含许多不同值的列,但是在处理基数较小的列时会变得很难使用,如只有几个固定值,如性别、婚姻状况、行政区等,要么不使用索引,要么建立位图索引。
位图索引为存储在某列中的每个值生成一个位图,例如对婚姻状况(未婚、已婚和离婚),可以生成三个向量,每个位图为每一个人都分配了0/1值,每个人三者中只存在一个1,当进行数据查找时,只需要查找相关位图中的所有1即可。
位图索引适合静态数据,不适合索引频繁更新的列。

使用B+树索引的好处

  1. B+树内部结点只存放键,一次读取可以在同一内存页中获取更多的键,可以更快地缩小查找范围。
  2. B+树的叶结点由一条链相连,因此当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)
    时间找到最小结点,然后通过链进行O(N)顺序遍历即可;找数据时先找到结点,然后链表遍历。

Hash索引和B+树索引的区别

  1. Hash索引进行等值查询更快,但是无法进行范围查询;
  2. Hash索引不支持使用索引进行排序;
  3. Hash索引不支持模糊查询以及多列索引的最左前缀匹配(因为Hash函数不可预测);
  4. Hash索引任何时候都避免不了回表查询数据,而B+树在符合聚簇索引,覆盖索引等的时候可以只通过索引完成查询;
  5. Hash索引当某个键值存在大量重复的时候,发生Hash碰撞,此时效率可能极差;B+树的查询效率比较稳定,对于所有的查询都是从根结点到叶子结点,且树的高度较低。

什么是前缀索引?

索引开始的几个字符,而不是索引全部值,避免因为需要索引很长的字符列使得索引变大变慢,这种索引被称为前缀索引,以节约空间并得到好的性能。
建立前缀索引的前提:前缀的辨识度高(如密码)。
前缀索引需要的空间变小,但也会降低选择性(不重复的索引值/表中所有行数T,范围为1/T~1)。
高选择性的索引在查找匹配的时候可以过滤掉更多的行,唯一索引的选择率为1,为最佳值。

什么是最左前缀匹配原则?

在MySQL建立联合索引(多列索引)时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
用索引当限制条件查询时需要从左往右,连续匹配;范围查询会中断匹配,中断即止。

添加索引的原则

  1. 在查询中很少使用或参考的列不要创建索引。
  2. 只有很少数据值的列不要创建索引(区分度太低,索引不能明显加快检索速度)。
  3. 定义为text、image和bit数据类型的列不应该增加索引(这些数据量处于相当大和相当小两个极端)。
  4. 当修改性能远远大于检索性能时,不应该创建索引。
  5. 定义有外键的数据列一定要创建索引。

什么是聚簇索引?

  1. 聚簇索引,又称为聚集索引,并不是一种索引类型,而是一种数据存储方式。指的是将数据存储和索引放到一起,找到索引也就找到了数据。
    MySQL里只有INNODB表支持聚簇索引,INNODB表数据本身就是聚簇索引,非叶子结点按照主键顺序存放,叶子结点存放主键以及对应的行记录。
    特点:
  • 索引和数据存放在一起,所以具有更高的检索效率;
  • 相比于非聚簇索引,可以减少磁盘的IO数;
  • 表的物理存储依据聚簇索引的结构,所以一个数据表只能有一个聚簇索引,但是可以有多个非聚簇索引;
  • 会在频繁使用、排序的字段上创建聚簇索引。
  1. 非聚簇索引:除聚簇索引外所有索引,也是B树结构,不存储真正的数据行,只包含一个指向数据行的指针。
类型定义举例
复合索引一个索引包含多个列(字段)的索引。CREATE INDEX idx_user_name_age ON user(name, age); 表示一个同时作用在 nameage 字段上的索引。
覆盖索引指某条 SQL 查询所需要的所有列都包含在某个索引中,不需要回表查询数据。若查询 SELECT name, age FROM user WHERE name = 'Tom',并且有上面的复合索引,则这个索引就是一个覆盖索引。

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

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

相关文章

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

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

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…

阿里云ACP云计算备考笔记 (5)——弹性伸缩

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

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

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

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…

边缘计算医疗风险自查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 适用场…

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…

Python:操作 Excel 折叠

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

MongoDB学习和应用(高效的非关系型数据库)

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

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…

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 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…