MySQL学习Day19——索引的数据结构

一、为什么使用索引:

索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据査找时,首先查看查询条件是否命中某条索引,符合则通过索引査找相关数据,如果不符合则需要全表扫描,即需要一条一条地查找记录,直到找到与条件符合的记录。

二、索引及其优缺点:

1.索引概述:索引是帮助MySQL高效获取数据的数据结构。索引是数据结构,可以简单地理解为排好序的快速查找数据结构。满足特定查找算法,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。索引是在存储引擎中实现的,因此每种存储引擎的索引不一定完全相同,并且每种存储引擎不一定支持所有索引类型。同时存储引擎可以定义每个表的最大索引数和最大索引长度。

2.使用索引的优点:

(1)提高数据检索的效率,降低数据库的IO成本

(2)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性.

(3)在实现数据的参考完整性方面,可以加速表和表之间的连接。换句话说对于有依赖关系的子表和父表联合查询时,可以提高查询速度。

(4)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低了CPU的消耗.

3.使用索引的缺点:

(1)创建索引和维护索引要 耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。

(2)索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,存储在磁盘上如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。

(3)虽然索引大大提高了查询速度,同时却会 降低更新表的速度。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

三、Innodb中的索引方案:

1.迭代一次:目录项记录的页

目录项其实和用户记录差不多,只不过目录项中的两个列是主键和页号。可以将表示目录项的记录称为目录项记录。可以使用记录头信息里的record_type(0:普通的用户记录;1:目录项记录;2:最小记录;3:最大记录)区分用户记录和目录项记录。

目录项记录和用户记录的不同点:

(1)目录项记录的record_type值是1,而普通用户记录的record_type值为0

(2)目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的,可能包含很多对。另外还有InnoDB自己添加的隐藏列。

目录项记录和用户记录的相同点:

(1)两者用的是一样的数据页,都会为主键生成Page Directory,从而在按照主键值进行查找时可以使用二分法来加快查询速度。

2.迭代2次:多个目录项记录的页

 3.迭代3次:目录项记录页的目录页

 4.B+Tree:

5.常见索引概念:

(1)聚簇索引:聚簇索引并不是一类单独的索引类型,而是一种数据存储方式(所有的用户记录都存储在叶子节点),也就是所谓的索引即数据,数据即索引。

特点:

a.使用记录主键值的大小记录和页的排序:页内的记录是按照主键的大小顺序排成一个单向链表;各个存放用户记录的值也是根据页中用户记录的主键大小顺序排成一个双向链表;存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录记录项的主键大小顺序排成一个双向链表;

b.B+数的叶子节点存储的是完整的用户记录,包括隐藏列

优点:

a.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快;

b.聚簇索引对于主键的排序查找和范围查找速度非常快

c.按照聚簇索引排列的顺序,查询一定范围数据的时候,由于数据都是紧密相连的,数据库不用从多个数据块中提取数据,所以可以节省大量的IO操作。

缺点:

a.MyISAM不支持聚簇索引,只有InnoDB支持

b.每个MySQL的表只能有一个聚簇索引,一般情况下就是该表的主键

c.innodb表的主键列尽量选用有序的顺序id

d.如果没有定义主键,innodb会选择非空的唯一索引代替,如果没有这样的索引,会隐式的定义一个主键来作为聚簇索引

(2)二级索引(辅助索引,非聚簇索引)

以非主键的列为查找条件,可以在该列上添加索引,此时的索引被称为二级索引

此时使用记录c2列的大小进行记录和页的排序:

a.页内记录是按照c2列的大小顺序排成一个单向链表

b.各个存放用户记录的页也是根据页中记录的c2列的大小顺序排成一个双向链表

c.存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中的目录项记录的c2列大小顺序拍成一个双向链表

B+树的叶子节点此时存储的并不是完整的用户记录,而是c2列和主键这两个列的值

目录项记录中不再是主键和页号的搭配,而变成c2列和页号的搭配

当按照c2列的值查找到完整的用户记录的话,仍然需要到聚簇索引中再查一遍,这个过程叫做回表。

聚簇索引和非聚簇索引的区别:

a.聚簇索引的叶子节点存储的是数据记录,非聚簇索引的叶子节点存储的是数据位置,非聚簇索引不会影响数据表的物理存储顺序

b.一个表只能有一个聚簇索引,因为只能有一种排序存储的方式,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索

c.使用聚簇索引的时候,数据的查询效率高,但如果对数据进行插入、删除和更新等操作效率比非聚簇索引低。

(3)联合索引

可以以多个列的大小作为排序规则,同时为多个列建立索引。

每条目录项记录都由c2,c3和页号三个部分组成,各条记录先按照c2列的值进行排序,如果记录的c2列相同,则按照c3列的值排序。

B+树的叶子节点处的值由c2,c3和主键列组成。

四、InnoDB的B+树索引的注意事项:

1.根页面的位置万年不动

一个B+树索引的根节点自诞生之日起,变不会再移动。只要对某个表建立一个索引,那么它的根节点的页号便会被记录到某个地方,然后凡是InnoDB存储引擎需要用到这个索引的时候,都会从固定的地方取出根节点的页号,从而来访问这个索引。

2.内节点中目录项记录的唯一性

3.一个页面最少存储2条记录

五、MyISAM中的索引方案:

MyISAM引擎使用B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址。MyISAM将索引和数据公开存储:

1.将表中的记录按照记录的插入顺序单独存储在一个文件中,称为数据文件。这个文件并不划分为若干个数据页。

2.MyISAM存储引擎会把索引信息另外存储到一个称为索引文件的另一个文件中。MyISAM会单独为表的主键创建一个索引,只不过在索引的叶子节点中存储的不是用户的完整记录而是主键值+数据记录地址的组合。

MyISAM首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以该data域的值为地址,读取相应的数据记录。

六、MyISAM与InnoDB对比:

1.在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在 MyISAM 中却需要进行一次回表操作,意味着MyISAM中建立的索引相当于全部都是二级索引。

2. InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

3.InnoDB的非聚簇索引data域存储相应记录主键的值,而MyISAM索引记录的是地址。换句话说InnoDB的所有非聚簇索引都引用主键作为data域。

4.MyISAM的回表操作是十分快速的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。

5.InnoDB要求表必须有主键(MyISAM可以没有)。如果没有显式指定,则MySQL系统会自动选择一个可以非空日唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节,类型为长整型。

七、索引的代价:

1.空间上的代价:每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用 16KB的存储空间,一棵很大的B+树由许多数据页组成,那就是很大的一片存储空间。

2.时间上的代价:每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引。而且B+树每层节点都是按照索引列的值从小到大的顺序排序而组成双向链表。不论是叶子节点中的记录,还是内节点中的记录(也就是不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单向链表。而增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂、 页面回收等操作来维护好节点和记录的排序。如果我们建了许多索引,每个索引对应的B+树都要进行相关的维护操作,会给性能拖后腿。

八、MySQL数据结构选择的合理性

磁盘的IO操作次数对索引的使用效率至关重要。

1.Hash结构:Hash本身是一个函数,又被称为散列函数,可以大幅提升检索数据的效率。是通过某种确定的算法将输入转变为输出,相同的输入永远可以得到相同的输出,假设输入内容有微小差异,在输出中通常会有不同的结果。哈希函数可能会将两个不同的关键字映射到相同的位置,此时称为碰撞,在数据库中一般采用链接法解决。即将散列到同一个槽位的元素放在同一个链表中。

 2.二叉搜索树:

(1)二叉搜索树的特点:一个节点只能有两个子节点,也就是一个节点的度不能超过2;左子节点处的值<本节点处的值,右子节点处的值≥本节点处的值;

(2)查找规则:

a.如果key大于根节点,则在右子树中进行查找

b.如果key小于根节点,则在左子树中进行查找

c.a.如果key等于根节点,则在直接返回根节点即可

3.平衡二叉搜索树(AVL树):AVL树是一棵空树或者它的左右两个子树的高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。M叉树的高度明显小于二叉树。

4.B-Tree:多路平衡查找树:B树作为多路平衡查找树,它的每一个节点最多可以包括M个子节点,M称为B树的阶。每个磁盘块中包含了关键字和子节点的指针。对于大量的索引数据来说,采用B树的高度要明显小于二叉树的高度。

5.B+Tree:B+树也是一种多路搜索树,是基于B树做出了相应的改进。主流的DBMS都支持B+树的索引方式,更适合文件索引系统。

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

 

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

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

相关文章

【深蓝学院】移动机器人运动规划--第6章 模型预测控制(MPC)与运动规划--笔记

0. Outline 1. Reactive Control&#xff08;反应式控制&#xff09; 控制学中的 “Reactive Control” 通常指的是一种控制策略&#xff0c;它依赖于系统对特定事件或变化的即时反应&#xff0c;而不是按照预定的计划或策略行动。这种控制往往是基于当前的传感器输入来做出决…

Mac 上游玩QQ飞车详细教程,IPA砸壳包资源下载安装

最近经过一番折腾终于在 MAC 上成功安装运行了 QQ 飞车&#xff0c;上图&#xff1a; 最后总结下来安装过程其实蛮简单的&#xff0c;但其中有很多卡点和坑所以浪费了很多的时间&#xff0c;特意整理本篇教程供大家参考 大体思路是这样的&#xff0c;先安装 playCover,该软件可…

PostMan使用自带js库base64编码、sha256摘要、环境变量的使用

目录 1、环境变量的使用2、base64编码、sha256摘要、以及脚本的使用3、脚本代码 在请求调试接口的过程中&#xff0c;因为要使用大量相同的参数&#xff0c;使用变量的方式能很大程度上减轻接口调用的工作量 版本说明&#xff1a;Postman for Windows&#xff0c;Version&#…

【Python笔记-设计模式】桥接模式

一、说明 桥接模式是一种结构型设计模式&#xff0c; 主要用于将抽象部分与它的实现部分分离&#xff0c; 从而能在开发时分别使用&#xff0c;使系统更加灵活&#xff0c;易于扩展。 (一) 解决问题 所有 组合类的数量将以几何级数增长 抽象和实现分离&#xff1a;桥接模式可…

数据结构day4

实现创建单向循环链表、创建结点、判空、输出、头插、按位置插入、尾删、按位置删除 loop_list.c #include "loop_list.h" loop_p create_head() {loop_p L(loop_p)malloc(sizeof(loop_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->le…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种&#xff0c;服务器可以主动向客户端推送信息&#xff0c;…

进程 2月24日学习笔记

1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xff09; PID:唯一识…

Linux---权限管理(ACL权限、特殊位和隐藏属性)

目录 1.ACT权限 1.1什么是ACT权限 1.2ACT图解 2.操作步骤 2.1添加测试目录、用户、组&#xff0c;并将用户添加到组 2.2修改目录的所有者和所属组 2.3设定权限 2.4为临时用户分配权限 2.4.1添加临时用户 2.4.2为临时用户分配特定权限 2.4.3查看目录权限&#xff0c;注…

NPM私服搭建(verdaccio)

官网地址&#xff1a;https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具&#xff0c;它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio&#xff0c;开发团队可以建立自己的 npm 包仓库&#xff0c;以更好地控制和管理其依…

使用redisMQ-spring-boot-starter实现消息队列和延时队列

简介 redisMQ-spring-boot-starter是一个轻量级的、基于Redis实现的消息队列中间件&#xff0c;它有如下优点&#xff1a; 开箱即用&#xff0c;你几乎不用添加额外的配置支持消息队列、延时队列&#xff0c;并提供精细化配置参数提供消息确认机制支持虚拟空间&#xff0c;不…

C++ 学习之Map容器

C++ Map容器概念 C++的Map容器是一种关联容器,它提供了一种将键和值相关联的方式。它以键值对的形式存储数据,并根据键的顺序自动进行排序。 Map中的键是唯一的,而值可以重复。你可以使用键来访问对应的值,就像使用索引访问数组中的元素一样。 Map容器的特点如下: 按照…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

IDEA查询对应功能的快捷键

首先要知道快捷键的key叫什么&#xff0c;然后通过key来找到对应的快捷键 比如下面这个查找删除导入未使用的类 跳转 或者安装对应插件

可视化 RAG 数据 — 用于检索增强生成的 EDA

原文地址&#xff1a;Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github&#xff1a;https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据&#xff0c;我们使用Pa…

怎么在线生成动态gif?这个网站一定要知道

静态图片是指一张固定的、不具有动态效果的图片。它通常是由像素点组成的&#xff0c;可以是照片、插图、图标等。静态图片只能呈现一种特定的场景或图像&#xff0c;不能展示动态变化。动态图片&#xff08;是由一系列静态图片组成的&#xff0c;通过快速连续播放这些画面&…

计算机网络-网络层,运输层,应用层

网络层/网际层 网络层的主要任务包括&#xff1a; 提供逻辑上的端到端通信&#xff1a;网络层负责确定数据的传输路径&#xff0c;使数据能够从源主机传输到目标主机&#xff0c;即实现端到端的通信。数据包的路由和转发&#xff1a;网络层根据目标主机的地址信息&#xff0c…

代码随想录刷题39,40天|62.不同路径

62.不同路径 想要求dp[i][j]&#xff0c;只能有两个方向来推导出来&#xff0c;即dp[i - 1][j] 和 dp[i][j - 1]。 此时在回顾一下 dp[i - 1][j] 表示啥&#xff0c;是从(0, 0)的位置到(i - 1, j)有几条路径&#xff0c;dp[i][j - 1]同理。 那么很自然&#xff0c;dp[i][j] …

【MySQL】数据类型(常见类型)-- 详解

一、数据类型分类 二、数值类型 1、tinyint 类型 在 MySQL 中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 有符号&#xff1a; 插入数据越界测试&#xff1a; 在 MySQL 表中建立属性列时&#xff0c;我们可以发现列名称在前&#xff0c;类型在…

深入探索pdfplumber:从PDF中提取信息到实际项目应用【第94篇—pdfplumbe】

深入探索pdfplumber&#xff1a;从PDF中提取信息到实际项目应用 在数据处理和信息提取的过程中&#xff0c;PDF文档是一种常见的格式。然而&#xff0c;要从PDF中提取信息并进行进一步的分析&#xff0c;我们需要使用适当的工具。本文将介绍如何使用Python库中的pdfplumber库来…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; for if max 代码&#xff1a; """ 题目分析&#xff1a;投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入&#xff1a; 产品数int; 总投资额int; 总风险int 产品投资…