数据库-深度剖析mysql索引原理(上)(三)

news2024/11/23 21:05:22

目录

一、什么是索引

二、索引由来

三、索引本质

四、索引数据结构

1、hsah

2、B+tree

五、myISAM 和Innodb这两个数据库的索引是如何实现的呢?

1、首先看 MYSAM

1、以主键Id字段建立索引

2、以name字段来建立索引

2、在看Innodb数据库引擎的数据库

1、以主键id字段建立索引

2、以及name字段来建立索引

3、为什么要用自增ID作为主键呢?

六、索引分类

七、索引优缺点

八、索引的设计原则

九、索引相关问题


一、什么是索引

肯定是一个数据结构,帮助高效获取数据的数据结构

作用:

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容,提高性能(查询速度)。

官方介绍:What is Indexx?

  • 索引是帮助高效获取数据的数据结构
  • 索引也可能是一个文件
  • 其他类型

-hash Map

-二叉树

-红黑树

二、索引由来

数据库数据最终是存在文件中

因此数据库底层是一个文件系统

当我们查询时

table

id

name

1

zhangsan

2

lisi

3

wanger

文件

Raw

select * from table where id=1;

我们的数据库表就是在ibd文件格式中的,当我们查询数据库时,就是去通过IO 流获取本地文件,通过柱面,磁道,扇面三个维度来找到我们要查询的数据,比如右边红色就代表我们的table.ibd表,当开始读时,就去扫描这个表获取数据。

上面这个是机械运动

如果在我们的内存总线中去读,他是非常快的,因为他是一个电信号,而我们如果要到磁盘去读,他就是一个机械运动,他们差两个数量集,所以说IO贵,所以常说避免IO

所以索引从操作系统层面他有哪些优化呢?

操作系统有一个概念:page

page他基于两个原理:

  • 时间局部性原理
  • 空间局部性原理

在CPU访问寄存器时,无论是存取数据亦或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。 

1、时间局部性(temporal locality) 

时间局部性指的是:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。 

2、空间局部性(spatial locality) 

如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。

都说IO贵,那么我们一下子读四块还不行吗?

可以简单理解为四条数据。

那么我们就不需要读四次。

读完把他放入内存中。

那么怎么理解时间局部性和空间局部性呢?

就是一个概率问题

在此基础上提出了page概念,来提高我们读取的性能

基于刚刚的认知,基于文件系统给我们打了个样

我们是不是可以建一个这样的索引,什么样的索引呢?

基于ID建一个索引

那么这个索引就是一个数据结构,做了两个维度,一个是ID 一个是地址 1是ID,0x12是地址。

当我们在查询的时候

select * from table where id =1;

就不用在磁盘所在的区域从头去读,直接找到。

这就是我们最原始索引概念的由来,基于文件系统。类比抽象出来的。

这就是索引

三、索引本质

索引也是一个文件,为什么呢?

因为他是存储数据的嘛,当他存储的数据够大的时候,不可能一直存储在我们的内存当中,所以可能也是一个文件存储。比如下面的MYI文件

四、索引数据结构

还支持其他类型数据结构的索引:

Hash ,红黑,二叉树他们也可以来做索引。

1、hsah

哈希索引的优势:

(1)等值查询。哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)

哈希索引不适用的场景:

(1)不支持范围查询

(2)不支持索引完成排序

(3)不支持联合索引的最左前缀匹配规则

Hash索引的弊端

一般来说,索引的检索效率非常高,可以一次定位,不像B-Tree索引需要进行从根节点到叶节点的多次IO操作。有利必有弊,Hash算法在索引的应用也有很多弊端。

a、Hash索引仅仅能满足等值的查询,范围查询不保证结果正确。因为数据在经过Hash算法后,其大小关系就可能发生变化。

b、Hash索引不能被排序。同样是因为数据经过Hash算法后,大小关系就可能发生变化,排序是没有意义的。

c、Hash索引不能避免表数据的扫描。因为发生Hash碰撞时,仅仅比较Hash值是不够的,需要比较实际的值以判定是否符合要求。

d、Hash索引在发生大量Hash值相同的情况时性能不一定比B-Tree索引高。因为碰撞情况会导致多次的表数据的扫描,造成整体性能的低下,可以通过采用合适的Hash算法一定程度解决这个问题。

e、Hash索引不能使用部分索引键查询。因为当使用组合索引情况时,是把多个数据库列数据合并后再计算Hash值,所以对单独列数据计算Hash值是没有意义的。

2、B+tree

2、为什么要用B+tree 来存储我们的索引呢?

因为数据库底层是有一个engine(数据库引擎)概念,不同的engin底层实现也是不一样的.

今天所将的myISAM 和Innodb为什么用的是B+tree,而不用上面所讲的Hash,红黑等等这些结构呢?

比如hash 只能针对部分查询,范围查询没法实现

判断好的索引依据是IO渐进复杂度

理解B tree和B+tree

Btree是一个二元组 ,每个node数据节点都是一个二元组,有一个key和data,2是key,绿色是data,key是主键,data是整个数据

B+tree的区别就是:不是每个节点都会存储数据的,他的数据会存储在我们的叶子节点上,

第二个点是,我们相邻的叶子节点都是有指向的但并不是每个B+tree都有,这里是在mysql做了处理。好处是,可以做hash做不了的事,范围查询,比如:大于。(那么怎么处理小于?)

五、myISAM 和Innodb这两个数据库的索引是如何实现的呢?

myISAM 和Innodb的底层到底是怎么存储的?

打开我们本地安装文件

我们分别建立一个test表,但产生的文件却不同?为什么呢?

1、首先看 MYSAM

我们的MYI文件字面上降的就是我们index(索引)文件; MYD文件是data文件,FRM是我们原始数据文件。

MYSAM的底层是由我们B+tree存储我们的索引的。

那么MYI就是一个B+tree,那么他是怎么来存储数据的呢?

1、以主键Id字段建立索引

如果MYD表中有索引,我们的MYI就有内容。如果我们建一个以ID为索引的时候,就会在MYI建立一个以ID为索引的B+tree。结构如上图,那么B+tree的叶子节点就是来存储数据的。是存的地址,这就是我们建立索引情况

当执行上面查询的时候,查询过程就是先判断MYI里面是否有,基于ID建立的索引,如果找到了,他就会根据从开始节点开始找,然后找到1这个叶子节点,就找到了。然后根据key对应的地址,去表中找ID等于1的数据。这个就是检索的过程。

像这样的索引,他有一个名字:叫非聚集索引。

2、以name字段来建立索引

这个就是以name为索引,组织的一个树,以name为节点的树,同样的,只有叶子节点才存储数据。同理叶子节点也是指向一个地址的。

查询时跟上面id过程一样。

这个就是MYSAM底层的数据存储。当存储一个简单的表时,他的底层结构就是这样的,

他的底层是非聚集索引。

2、在看Innodb数据库引擎的数据库

他产生的表文件只有两个?为什么呢?看起来好像没有index文件的感觉。为什么他不需要这样一个东西呢?

InnoDB底层是聚集索引什么是聚集索引的,就是说他没有索引,或者没有MYI文件

他只有一个IBD文件,它里面的数据是怎么存储的呢?如下

1、以主键id字段建立索引

为什么叫聚集索引?因为他是以主键为索引来组织数据的,他的叶子节点是存储整个数据

innoDB数据是可以不建主键的,如果我们没有建立,数据库底层会帮我们去默认生成一个

为什么我们用的时候一定要建立呢?是因为mysql连接器客户端自己做了校验。必须我们去建立所以,我们以为一定要建立主键。

这就是聚合索引,这就是为什么只有两个文件,因为我们本身存储数据的树就是一个索引

2、以及name字段来建立索引

这时候我们叶子节点存储的数据是主键。为什么呢?

因为他是一个聚集索引。所以这里不再需要地址去查找数据,他们在一个文件中,不需要地址。

查询时,去看name是不是索引,如果是,就去找到james所在的主键,然后就去我们的树上这里面找到主键对应的数据。

3、为什么要用自增ID作为主键呢?

因为和UUID比,查询检索的时候,字符串比较和数字比较那个效率更快

还有就是插入的时候,uuid是按字母排序他的每个节点都会重组,重新排序,你要插入某个节点,就要别人给你挪位置等等。而数字,都会在最右边追加,而且每次都是填满每个空间,连续的,不会再由变更,而且是顺序读写由kafka可知顺序读写是最快的。效率也相对高。如图

六、索引分类

分类:聚集索引非聚集索引

使用索引分类

1)普通索引:不附加任何限制条件,可创建在任何数据类型中,其值是否唯一和非空由字段本 身的完整性约束条件决定。

2)唯一性索引:使用UNIQUE参数设置索引。索引的值是唯一的

3)全文索引:使用FULLTEXT参数设置索引。只能创建在CHAR、VARCHAR或TEXT类型字段上。查询数据量较大的字符串类型的字段时,使用全文索引可提高查询速度。

4)单列索引:在表中的单个字段上创建索引。只根据该字段进行索引(索引对应一个字段)。单列索引可以是普通索引或者唯一性索引或者全文索引。

5)多列索引:在表的多个字段上创建一个索引。可通过几个字段进行查询。

只有查询条件使用多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

6)空间索引:使用SPATIAL参数设置。

只能建立在空间数据类型上,可提高系统获取空间数据的效率。

只有MyISAM存储引擎支持空间检索,索引字段不为空

七、索引优缺点

优点:

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

2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 

3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 

4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 

5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。 

3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

因为索引非常占内存,所以索引也需要谨慎添加,那些字段需要索引。

八、索引的设计原则

1)选择唯一性索引。索引的列的基数越大,索引效果越好。

2)为经常需要排序、分组和联合操作的字段建立索引(避免排序操作,浪费时间)

3)为常作为查询条件的字段建立索引(提高查询速度)

4)限制索引的数目,不要过度索引(每个索引都需要占用磁盘空间,会降低写操作的性能。)

5)尽量使用短索引。如果对字符串进行索引,应该指定一个前缀长度。

6)尽量使用左前缀来索引(字段值很长,使用值的前缀索引)

7)删除不再使用或者很少使用的索引(减少索引对更新操作的影响)

8)对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存。

InnoDB表的普通索引会保存主键的键值,主键应选择较短的数据类型,减少索引的磁盘占用,提高索引的缓存效果。

9)辅助索引,叶子结点存放着索引字段的值及对应的主键值

10)对查询where条件中区分度高的字段加索引;对查询分组和排序分组加索引。

11)一下情况无法使用到索引:like通配符在最左,not in!=<>队列做函数运算, 隐式数据类型转换,OR子句

12)FORCE INDEX强制加索引

数据库-sql执行深度剖析以及redo log和undo log(下)(二)_平凡之路无尽路的博客-CSDN博客

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

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

相关文章

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK&#xff08;适用于各个版本&#xff09;_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题&#xff1a;在比特币中&#xff0c;怎么证明这个交易是你发布的&#xff1f; 这是就需要用到数字…

客户关系应该如何管理?

网络经过十多年的产业发展&#xff0c;中国的网络用户已经超过了8亿&#xff0c;网络也渐渐改变了盲目的商业价值追求&#xff0c;趋于稳定理性&#xff0c;已经开始向着多个路径全面性产业发展。网络上出现了各式各样的网络营销方式&#xff0c;如邮件网络营销、广告行业、浏览…

【python实战】朋友因股票亏了,很惨常愤恨不平,当天我就分析出原因:怎么做到的?(听说关注我的人会暴富)

导语 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 对于大部分股票投资者来说&#xff0c;一年能拿住翻倍的股票就实属不易。一年10倍&#xff0c;甚至…

生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN

编号: 162943中文名称: 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN英文名: Biotin-εAhx-Gly-Leu-Lys-Leu-Arg-Phe-Glu-Phe-Ser-Ly英文同义词: Biotinyl-LC-hCAP-18 (134-170) (Scrambled), Biotinyl-LC-Cationic Antimicrobial Protein 18 (134-170) (human) …

hi mate, lets recall the bloody “JOIN“

补补数据库基础 上图中&#xff0c;表A的记录是123&#xff0c;表B的记录是ABC&#xff0c;颜色表示匹配关系。返回结果中&#xff0c;如果另一张表没有匹配的记录&#xff0c;则用null填充。 注意&#xff1a;多表连接查询会比直接使用自带的API查询表中的一个属性&#xff0…

基于STM32单片机的智能窗帘系统

本设计是基于STM32单片机的智能窗帘系统&#xff0c;主要实现以下功能&#xff1a; 1、 定时模式&#xff1a;早上&#xff08;7:00&#xff09;自动打开窗帘&#xff0c;晚上&#xff08;19&#xff1a;00&#xff09;自动关闭窗帘。 2、 手动模式&#xff1a;通过按键实现对…

处理 S4过账时的错误:“更正统一日记账分类账的定制设置”

目录 一、问题起因 二、问题分析​​​​​​​ 三、解决方法: 一、问题起因 在一个新配置的S4系统做FI凭证出现了如下报错&#xff1a; 点开后&#xff0c;报错显示如下&#xff1a; 更正统一日记账分类账的定制设置 消息号 FINS_ACDOC_CUST201 诊断 通用日记账的分类账…

SCADA系统在石油炼制行业的应用:如何实现石油炼制过程实时数据采集与监控?

一、应用背景 随着经济的逐步发展&#xff0c;企业开始关注基础技术和生产质量的提升。其中&#xff0c;作为基础工业项目的石油炼制企业需要对整体技术进行集中的整合&#xff0c;强化基础动态生产调度以及系统化的电子商务结构&#xff0c;才能提升整个行业的市场竞争力。 …

抢跑“补盲”风口,纯固态激光雷达上车面临哪些挑战?

未来两年&#xff0c;激光雷达市场高速发展的同时&#xff0c;来自市场的需求也逐渐清晰化。 高工智能汽车研究院预测数据显示&#xff0c;预计2025年前装标配激光雷达交付将有望达到200万颗/年的规模。其中&#xff0c;面向私人消费市场的车型&#xff0c;将主要以1颗前向、2…

“如何实现高效的应用交付”鲁班会开发者训练营厦门站进行时

摘要&#xff1a;2022年11月18日&#xff0c;来自厦门创新中心的40余位开发者&#xff0c;齐聚华为云鲁班会开发者训练营厦门站&#xff0c;与华为云技术大咖共同探讨技术未来&#xff0c;落地应用交付。为了抓住新时代IT技术脉搏&#xff0c;一同探讨企业数字化转型中面临的种…

Qt富文本处理

一、富文本文档结构 文本文档由 QTextDocument 类表示&#xff0c;该类包含有关文档内部表示、结构的信息&#xff0c;并跟踪修改以提供撤消/回撤功能。 1.1、基本结构 每个文档始终包含一个根框架&#xff0c;并且始终包含至少一个文本块。 框架/表格总是由文档中的文本块…

16.PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理

PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理 使用Qt编程&#xff0c;几乎不用考虑事件&#xff0c;因为当产生某种事件时&#xff0c;Qt窗口部件都会发射一个相应的信号&#xff08;即Qt会把事件转换为一个对应的信号&#xff09;&#xff0c;比如按钮被按下时&#x…

Servlet是什么?怎么使用?

前言&#xff1a; 服务器里面资源分为动态资源和静态资源 动态资源&#xff1a;Servlet、Jsp 静态资源&#xff1a;HTML、CSS、JS 一、概念 1.什么是servlet&#xff1f; 本质上是一个接口&#xff0c;提供了规范。是java提供的一门动态的web资源开发技术。 2.servlet体…

【C++】string类超详细解析

参考文献&#xff1a;C标准库官网 前言&#xff1a;在C/C的学习过程当中一定一定要多刷题&#xff0c;牛客网作为国内内容超级丰富的IT题库&#xff0c;尤其是它的C、C&#xff0c;有从入门到大厂真题&#xff0c;而且大部分的考试题目也是从中抽取&#xff0c;还有很多面经&am…

智慧职教解决方案-最新全套文件

智慧职教解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧职教全套最新解决方案合集一、建设背景 职业教育目前存在的问题&#xff1a; 发展理念相对落后国际化程度不高基本制度不健全层次结构不合理基础能力相对薄弱社会吸引力不强行业企业参与不…

20221121将行车记录仪记录的MJPEG格式的AVI片段合并的MKV转换为MP4

20221121将行车记录仪记录的MJPEG格式的AVI片段合并的MKV转换为MP4 2022/11/21 21:51 &#xff08;一&#xff09; 缘起&#xff0c;用行车记录仪录制的爬拉胡线&#xff08;惠州大南山&#xff09;的AVI视频&#xff0c;一个片段5分钟。 使用mkvtoolnix-gui将AVI合并成为MKV视…