0201概述和结构-索引-MySQL

news2025/1/16 7:49:28

文章目录

    • 1 概述
      • 1.1 介绍
      • 1.2 优缺点
    • 2 索引结构
      • 2.1 B+Tree索引
      • 2.2 hash索引
      • 2.3 对比
    • 3 索引分类
      • 3.1 通用分类
      • 3.2 InnoDB存储引擎分类
    • 4 思考题
    • 后记

1 概述

1.1 介绍

索引是帮忙MySQL 高效获取数据的数据结构(有序)。在数据之外,数据系统还维护着满足特定查找算法的数据结构。这些数据结构以某种方式音乐(指向)数据,这样就可以在这些数据结构傻姑娘实现高级查找算法,这种数据结构就是索引。

1.2 优缺点

优势缺点
提高数据检索的效率,将低数据IO成本索引列需要占有空间
通过索引列对数据进行排序,将低数据排序的成本,将低CPU的消耗索引大大提高查询效率,在更新的时候需要维护索引,效率降低

2 索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,按照存储结构分类主要包含以下几种:

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持B+树索引
Hash索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-tree(空间索引)空间索引是MYISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES

2.1 B+Tree索引

B+树(B+tree)是一种常用的平衡树数据结构,也是MySQL中常用的索引结构之一,用于提高数据访问效率。B+树与B树类似,但有着更高的磁盘块利用率和更好的查询性能。

B+树的特点如下:

  1. 所有关键字都出现在叶子结点的链表中,且链表中的关键字恰好是按照大小顺序排列的。
  2. 所有非叶子结点可看成是索引部分,结点中仅含有其子树根结点中的最大(或最小)关键字。
  3. 每个叶子结点都带有指向其后继结点的指针,加速区间访问或遍历。

相对于B树,B+树的区别在于:

  1. 非叶子结点仅仅是索引,不存储数据。
  2. 所有数据都存储在叶子结点中。
  3. 叶子结点之间都有指针相连,可以轻易地进行区间查找或遍历。

B+树通常应用于磁盘上的存储,因为它能够更好地利用磁盘块,减少了磁盘I/O操作的次数。当数据量较大时,B+树能够更快地查询到数据。

在MySQL中,使用B+树索引结构的表通常有一个叶子节点包含所有数据的指针,以及多个索引节点来加速查找。这些索引节点仅仅是用来定位叶子节点的位置,不存储具体的数据。B+树索引可以提高查询性能,特别是对于范围查询等操作,但对于大量的更新操作,B+树索引会比较慢,因为更新数据时需要不断地调整索引结构。

如下图2.1-1所示:

在这里插入图片描述

B+树一个节点对应一页/块,页为InnoDB引擎逻辑存储结构中固定大小的存储结构。每个非叶子结点不用存储数据,可以存储更多的key,同样数据量大情况下,树的高度自然更低,查询效率相应更高。

InnoDB引擎逻辑存储结构,如下图2.1-2所示:

在这里插入图片描述

2.2 hash索引

哈希索引(hash index)基于哈希表实现。哈希索引通过Hash算法(直接定址法、平方取中法、折叠法、除数取余法、随机数法)将数据库的索引列数据转换成定长的哈希码作为key,将这条数据的行的地址作为value一并存入Hash表的对应位置。

在MySQL中,只有Memeory引擎显式的支持哈希索引,这也是Memory引擎表的默认索引结构,Memeory同时也支持B-Tree索引。并且,Memory引擎支持非唯一哈希索引,如果多个列的哈希值相同(或者发生了Hash碰撞),索引会在对应Hash键下以链表形式存储多个记录地址。

Hash索引的特点:

  • Hash索引只用于对等比较(=,in),不支持范围查询(between,>,<,…);
  • 无法利用索引完成排序操作;
  • 查询效率高,通常只需要一次检索就可以了。

存储引擎支持:

在MySQL重,支持hash索引的是Memory引擎,而Inno DB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

2.3 对比

问题1:为什么Inno DB存储引擎选择使用B+Tree索引结构?

  • B+Tree,相对于二叉树,层数少,搜索效率高。
  • 相比于B-Tree非叶子结点不存储数据,每个结点(页)能够存储更多的键,那么相同数据量大情况下层级更低,效率更高;
  • 相比于Hash,它支持范围查询。

3 索引分类

3.1 通用分类

主要分类如下表3-1所示:

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能由一个PRIMARY
唯一索引限制同一表中某数据列值不能重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXt
  1. 主键索引(Primary Key Index):主键是一种用于唯一标识每个记录的索引,通常使用B+树作为索引结构,可以快速定位到指定的记录。主键索引在查询、更新、删除等操作时具有高效性能。
  2. 唯一索引(Unique Index):唯一索引要求索引列的值不能重复,通常用于保证数据的唯一性和数据完整性。唯一索引通常也使用B+树作为索引结构,与主键索引类似。
  3. 普通索引(Normal Index):普通索引是最基本的索引类型,它可以加速查询特定列或多个列的值。普通索引也常使用B+树作为索引结构。
  4. 全文索引(Full-Text Index):全文索引可以用于高效地进行文本匹配和搜索。它不像普通索引只能匹配关键字的前缀,而是能够匹配关键字的任意位置。全文索引通常采用特殊的数据结构,如倒排索引等。

需要根据具体场景和查询需求来选择合适的索引类型。选择适当的索引类型可以有效地提高数据库的查询效率和性能

3.2 InnoDB存储引擎分类

InnoDB存储引擎中,根据所有的存储形式,又可以分为以下两种:

分类含义特点
聚集索引将数据存储和索引放在一起,索引结构的叶子结点保存了行数据必须有,而且只有一个
二级索引将数据和索引分开存储,索引结构的叶子结点关联的是对应的主键可以存在多个

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引;
  • 如果不存在主键,将使用第一个唯一索引作为聚集索引;
  • 如果表没有主键或者没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

示例表及结构如下图3.2-1所示:

在这里插入图片描述

  • 聚集索引为主键索引,叶解决存储主键对应行数据;
  • name字段建立的索引为二级索引,叶结点存储主键。

接下来我们该SQL语句select * from user where name='Arm'的执行过程,如下图3.2-2所示:

在这里插入图片描述

具体过程如下:

  • 根据name字段查找,先根据name=‘Arm’到name字段到二级索引进行匹配查找,查找结果为对应的主键10;
  • 在根据主键id=10在id字段的聚集索引(主键索引)匹配查找,找到对应的行记录row。

回表查询:先在二级索引中查找数据,找到主键。然后在到聚集索引中根据主键获取数据的方式,称为回表查询。

4 思考题

示例表同#3中user表

  1. 以下2条SQL语句那个执行效率高?为什么
select * from user where id=10;
select * from user where name='Arm';
-- id为主键,name字段创建有索引

回答:第一条SQL语句执行效率高;

解析:

  • 第一条查询字段id为主键,通过聚集索引根据主键匹配查询相应的数据行;而第二条查询根据name字段,需要先通过二级索引查询出主键,在通过聚集索引根据id(主键字段)查询对应数据。
  1. InnoDB的主键索引B+tree指定高度可以存储多少条记录?

B+tree存储结构如下图4-1所示所示:

在这里插入图片描述

假设: 一行数据大小为1k,一页中可以存储16行这样的数据。InnoDB的指针占用6个字节的空

间,假设主键即使为bigint,占用字节数为8。 高度为2:

n ∗ 8 + ( n + 1 ) ∗ 6 = 16 ∗ 1024 , 算出 n 约为 1170 ; 1171 ∗ 16 = 18736 n*8+(n+1)*6=16*1024, 算出n约为 1170; 1171* 16 = 18736 n8+(n+1)6=161024,算出n约为1170;117116=18736 也就是说,如果树的高度为2,则可以存储 18000 多条记录。

高度为3:
1171 * 1171 * 16 = 21939856 也就是说,如果树的高度为3,则可以存储 2200w 左右的记录。

一行数据大小为rowSize,一页大小为16k,InnoDB的指针占有6字节大小,主键类型占有大小为primarySize,高度为h,则存储记录公式为:

  • 非叶结点计算主键数量: k e y s ∗ p r i m a r y S i z e + ( k e y s + 1 ) ∗ 6 = 16 ∗ 1024 keys*primarySize+(keys+1)*6=16*1024 keysprimarySize+(keys+1)6=161024

  • 叶结点计算可以存储多少记录: k e y s h − 1 ⋅ 16 ∗ 1024 r o w S i z e = r e c o r d s \quad keys^{h-1}\cdot\frac{16*1024}{rowSize}=records keysh1rowSize161024=records

  • 大小单位为字节,keys为主键数量。

后记

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

参考链接:

[1]ChatGPT

[2]MySQL数据库视频[CP/OL].2020-04-16.p66-73.

[3]MySQL相关(番外篇)- innodb 逻辑存储结构.[CP/OL].

[4]MySQL之InnoDB存储引擎-逻辑存储结构.[CP/OL].

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

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

相关文章

【CF1764C】Doremy‘s City Construction(二分图,贪心)

【题目描述】 有nnn个点&#xff0c;每个点的点权为aia_iai​&#xff0c;你可以在任意两个点之间连边&#xff0c;最终连成的图需要满足&#xff1a;不存在任意的三个点&#xff0c;满足au≤av≤awa_u\le a_v\le a_wau​≤av​≤aw​&#xff08;非降序&#xff09;且边(u,v)(…

『pyqt5 从0基础开始项目实战』06. 获取选中多行table 重新初始化数据(保姆级图文)

目录导包和框架代码重新初始化绑定点击事件获取当前选中的所有行id实现初始化数据完整代码main.pythreads.py总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 导包和框架代码 请查…

案例分享 | 金融业智能运维AIOps怎么做?看这一篇就够了

​构建双态IT系统&#xff0c;AIOps已经是必然的选择。运维数字化转型已是大势所趋&#xff0c;实体业务的逐步线上化对IT系统的稳定与安全提出更高要求&#xff0c;同时随着双态IT等复杂系统的建立&#xff0c;如何平衡IT运维效率与成本成为区域性银行面临的重要问题&#xff…

Windows编程基础

Windows编程基础 Unit1应用程序分类 控制台程序&#xff1a;Console Dos程序&#xff0c;本身没有窗口&#xff0c;通过windows Dos窗口执行 窗口程序 拥有自己的窗口&#xff0c;可以与用户交互 库程序 存放代码、数据的程序&#xff0c;执行文件可以从中取出代码执行和获取…

【MySQL】索引事务

摄影分享~ 文章目录索引概念使用场景使用事务概念使用事务的特性索引 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 通过目录&#xff0c;就可以…

如何使用数字示波器

本文介绍以鼎阳SIGLENT SDS1122E数字示波器为例。 带了一根电源线&#xff1b;两根信号线&#xff0c;每根信号线都有几个小配件&#xff0c;如下所示&#xff1a; 使用概述 我们都知道万用表&#xff08;又称欧姆表&#xff09;是工程师最常用的调试电路的工具&#xff0c;但万…

技术+商业“双轮”驱动,量旋科技加速推进全方位的量子计算解决方案

【中国&#xff0c;深圳】4月14日&#xff0c;在第三个“世界量子日”&#xff0c;以“‘双轮’驱动 加速未来”为主题的量旋科技2023战略发布会在线上举办。 本次发布会&#xff0c;量旋科技全线升级了三大业务线产品&#xff1a;其中重点布局的超导量子计算体系产品&#xf…

监控系统 Prometheus 的说明

一、Prometheus 是什么&#xff1f; ELK Stack 日志收集和检索平台想必大家应该比较熟悉&#xff0c;Elasticsearch Filebeat Logstash Kibana。 而 Prometheus 就相当于一整个 ELK&#xff0c;但是它其实并不是适合存储大量日志&#xff0c;也不适合长期存储&#xff08;默…

【AI绘图学习笔记】transformer

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录Seq2seq实现原理EncoderDecoderAutoregressive自回归解码器Non-Autoregressive非自回归解码器Corss-attention总结TrainingtrickCopy MechanismGuided AttentionBeam Search强化学习&#xff08;Reinforcement…

AVL树,红黑树,红黑树封装map和set

文章目录AVL树AVL树的实现AVL树的节点AVL树的平衡因子AVL树的插入AVL树的旋转左单旋右单旋左右正旋右左正旋中序遍历打印节点判断子树是否平衡整体代码验证代码红黑树概念性质&#xff08;规则&#xff09;红黑树的实现结点定义插入parent在grandparent的左情况一&#xff1a;u…

登录认证功能的统一拦截技术(拦截器)

目录 1.说明 2.使用方法 (1) 定义拦截器 (2)注册配置拦截器 (3)示例&#xff1a; 3.interceptor详细说明 (1)拦截路径 (2)执行流程 (3)过滤器和拦截器的区别 4.登录校验的拦截器实现 5.全局异常处理(补充说明) 1.说明 拦截器是一种动态拦截方法调用的机制&#xff0…

3年功能测试被辞,待业3个月,2023不会自动化测试真的找不到工作吗?

前言 来自一位粉丝的投稿&#xff0c;在测试行业已近打拼了3年&#xff0c;一直兢兢业业&#xff0c;前不久被公司以人员优化的理由辞退&#xff0c;到现在已近过去了3个月还没有找到测试工作&#xff0c;让她很焦虑&#xff0c;我通过和她的交流才发现她最大的问题就是技术方…

从零开始学习Python中UnitTest测试框架:实现高效自动化测试流程

目录&#xff1a;导读 引言 1.白盒测试原理 2.自动化测试用例编写 3.UnitTest测试框架 3.1UnitTest组件&#xff08;测试固件&#xff09; 3.1.2测试套件 3.1.3测试运行 3.1.4测试断言 3.1.5测试结果 3.2unittest测试固件的详解 3.2.1测试固件每次均执行 3.2.2测试…

【JavaEE】CAS机制(比较并交换)

哈喽&#xff0c;大家好~我是你们的老朋友保护小周ღ&#xff0c;本期为大家带来的是 CAS (compare and swap) 比较并交换&#xff0c;CAS 是物理层次支持程序的原子操作&#xff0c;CAS 是一种完全不同于 synchronized 锁保证多线程安全问题的机制&#xff0c;可以用来进行无锁…

Java基础——Stream流

&#xff08;1&#xff09;Stream流概述&#xff1a; 1.什么是Stream流&#xff1f; 用于简化集合和数组操作的API。结合了Lambda表达式。方便操作集合/数组的手段&#xff08;集合/数组才是开发的目的&#xff09;。2.体验Stream流的作用&#xff1a; import java.util.Arr…

高并发场景I/O优化

大家好&#xff0c;我是易安&#xff01; Java I/O是一个众所周知的概念。它常被用于读写文件、实现Socket信息传输等操作&#xff0c;这些都是系统中最常见的与I/O相关的任务。 我们都了解&#xff0c;I/O的速度相较于内存速度较慢。在当前大数据时代背景下&#xff0c;I/O性能…

java足球体育新闻资讯发布系统ssh

为 本系统的功能目标分为以下几个模块&#xff1a;用户管理模块、足球新闻类别管理模块、足球新闻管理模块、留言管理模块和前台足球新闻浏览模块。 系统功能模块的划分&#xff0c;是在需求分析基础上进行的&#xff0c;是把具有复杂功能的系统通过设计分解为具有基本独立&…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的&#xff0c;这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

文章目录Day 03&#xff1a;一、事务1. 原则2. 测试实现二、索引1. 分类2. 创建索引3. 分析 sql 执行的状况4. 测试索引5. 索引原则三、数据库用户管理四、备份五、规范数据库设计1. 三大范式注意&#xff1a;Day 03&#xff1a; 一、事务 事务(transaction)&#xff1a;要么…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…