MySQL基础笔记(1)-深入理解索引

深入理解MySQL数据库索引 MySQL的索引是一种数据结构它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度。MySQL索引类似于书籍的目录,通过指向数据行的位置,**可以快速定位和访问表中的数据。**就像使用汉语字典的目录(索引)页,可以通过笔画、偏旁部首、拼音等排序的目录快速查到所需要的字。索引应该创建在高频查询的列上。索引需要占用额外的存储空间 – 每一个索引都会生成对应的一个索引树。 阅读详情

目录

 

一.B树介绍

1.B树是什么

2.B-树介绍

3.B+树介绍

二.索引介绍

1.索引为什么能加快查询

2.MySQL索引有哪些

3.为什么不在每列都创建一个索引

4.什么地方建立索引

5.聚簇索引和非聚簇索引(都通过B+树实现)

1.聚簇索引和非聚簇索引有什么区别

​2.聚簇索引中主键索引和辅助索引的关系

​3.聚簇索引为什么要避免使用UUID作为主键

6.覆盖索引

7.最左匹配原则

1.什么是最左匹配原则

2.联合索引的底层实现(B+树)


一.B树介绍

1.B树是什么

B树是一种用于外部排序的数据结构,它的特点是树整体十分地矮胖,所以很适合用于磁盘系统中,可以大大地减少系统读取数据时的I/O次数。B树是B-树和B+树的统称。

2.B-树介绍

B-树是为了磁盘外部读取所提供的一种平衡多叉树。在InnoDB存储引擎中使用的是操作系统中的页(page)来存储数据,默认为16k。当数据超出了一页时,会进行多页存储,那么在每次获取特定主键下的数据时,需要多次的IO去分页查询,每一次IO都会耗费相当多的时间。但是B-树的出现解决了这个问题,它能够在尽量少的IO次数下获取到数据。

特点

B-树存在阶数m的概念,m阶的B-树需要满足以下条件:

  1. 除了根节点和叶子节点之外的其他节点,其所含有的子节点数量N,(m / 2) <= N <= m
  2. 每个节点都含有K个关键字(一般为主键),关键字中携带数据, (m / 2) <= K <= m - 1;关键字之间升序排列
  3. 每个节点都有K + 1个指针与关键字交替排列,分别指向主键区间为(k-1, k + 1)的子节点
  4.  

如图是一个三阶的B-树: 

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。

模拟查找关键字29的过程:

根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】 比较关键字29在区间(17,35),找到磁盘块1的指针P2。 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】 比较关键字29在区间(26,30),找到磁盘块3的指针P2。 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】 在磁盘块8中的关键字列表中找到关键字29。 分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

3.B+树介绍

B+树是B-树的改进版,它比B-树更适合用于外部存储。B-树需要在每个节点中携带有一定数量的键和数据,所以没一个节点所需的空间是较大的,这样会导致一页放不下那么多的节点,所以需要另开一页来存放节点,这会导致IO次数的增加,所以B+树改进了这一点。在InnoDB中使用的就是B+树索引。

特点

  1. 除了叶子节点外,其他节点都不携带数据,只携带键
  2. 通过双端双向链表将所有叶子节点相连
  3. 其他特性和B-树一样

 

通过这两点优化,可以大大减少每个节点的占用的大小,并且由于叶子节点使用了双端双向链表连接起来,所以可以实现区间查询。

二.索引介绍

1.索引为什么能加快查询

索引将无序的数据按照一定的算法和数据结构组织起来,从而使得数据变得相对有序,这优化MySQL的查询效率。

2.MySQL索引有哪些

MySQL的索引可分为两类,一类是B+树索引,第二类是Hash索引。Hash索引的底层实现就是哈希表,而哈希表对于单条数据的获取都是常数时间的,所以在大多数查询都是单条数据时,推荐使用Hash索引;而其他大部分情况,例如需要区间查询,那么推荐使用B+树索引。

3.为什么不在每列都创建一个索引

  1. 索引需要占用较多的物理空间
  2. 在更改数据时,需要将大量的索引同时更改和维护
  3. 创建和维护索引都需要耗费时间

4.什么地方建立索引

一个原则是,表的数据过少,无需建立索引,因为这样会使得创建和维护索引的开销性价比下降。

  1. 在经常需要查询的字段上
  2. 在经常需要使用WHRER语句的字段上
  3. 在经常需要使用ORDER BY排序的字段上

5.聚簇索引和非聚簇索引(都通过B+树实现)

1.聚簇索引和非聚簇索引有什么区别

  1. 聚簇索引:索引和数据放在了一起,找到了索引就找到了数据。因为聚簇索引需要和数据绑定,所以一张表只可以有一个聚簇索引,InnoDB中默认设为主键,其他在聚簇索引之上建立的索引被称为辅助索引。 InnoDB存储引擎采用的是聚簇索引实现,B+树的叶子节点使用主键+数据绑定。所以叶子节点在物理存储空间上是连续的。

  2. 非聚簇索引:索引和数据分开存储,首先需要找到索引,然后再确定数据位置找到数据。MyISAM存储引擎使用的是非聚簇索引,B+树的叶子节点使用索引+真实数据地址实现的。所以叶子节点在物理存储空间上不连续。

2.聚簇索引中主键索引和辅助索引的关系

在InnoDB中,默认使用的是B+树实现的聚簇索引。一般以主键作为聚簇索引,而其他建立的索引为辅助索引。例如下表guest_table,我们在id上建立聚簇索引和在Name字段上建立一个辅助索引: 

当使用 select * from guest_table where id = 5时,可以直接通过建立于主键上的聚簇索引查询到数据:id = 5, Name = Gates, Company = Microsoft。

当使用 select * from guest_table where Name = "Ellison"时,会先通过以Name为索引的辅助索引去定位到Name为Ellison的id = 14,然后通过这个id去查询主键的聚簇索引,获取到整条数据id = 14, Name = Ellison, Company = Oracle。(上述过程也被称为回表查询,可以使用索引覆盖去避免回表查询。)

 

而在MyISAM实现的非聚簇索引中,辅助索引存储的不是Name与id,而是Name与真正的数据指针,所以可以直接通过辅助索引以Name为索引查询到数据,而不需要二次定位。

 

 

3.聚簇索引为什么要避免使用UUID作为主键

因为如果使用了UUID作为主键会导致在索引的中间区间添加数据,由于B+树的叶子节点是有序的,所以会导致叶子结点的重新排列,导致索引的更新。而使用自增主键的话,每次只需要在叶子节点末尾添加数据即可,不需要打乱索引。

 

6.覆盖索引

索引覆盖指的是仅通过索引就可以获得数据,如在查询主键,由于主键自身存在索引,那么在查到索引时代表数据(即主键)也已经查询到了。

如果select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

select id from table

  1. 在不使用where语句的情况下使用索引覆盖
  2. 使用where语句时,如果where条件建立了辅助索引(不是主键),那么还需回表查询一次主键的索引,所以可以建立查询字段之间的联合索引,用以达到索引覆盖的目的。

7.最左匹配原则

1.什么是最左匹配原则

最左优先匹配,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。

假设建立了联合索引index(a, b, c),那么查询条件中,只要从a开始的连续条件情况都可以使用到联合索引提高查询效率:

  1. where a = 1 and b = 2 and c = 3
  2. where a = 1 and b = 2
  3. where a = 1
  4. where c = 3 and b = 2 and a = 1(自动优化顺序)

以下情况不可使用到该联合索引

  1. where b = 1 and a = 2
  2. where b = 1 and c = 3
  3. where c = 1
  4. where a = 1 and b = 2 and c <= 3(c遇到区间查询会打断联合索引查询)

2.联合索引的底层实现(B+树)

联合索引当然还是一颗B+树,只不过联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。 例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的:

 

1. where a = 1

可以看到a时有序的,此时b是无序的,所以可以直接根据a进行匹配。

2. where a = 1 and b = 2

可以看到,当a确定时,b就变成了有序的,此时可以按照之前的规则对b进行匹配。

3. where b = 1

由于b在a没有确定的时候是无序的,所以无法对b进行匹配。

深入理解MySQL索引底层数据结构与算法 目录 一 理解索引的特性 二 索引的各种存储结构及其优缺点 (一)二叉树 (二)红黑树 (三)Hash (四)B-Tree (五) B+Tree(MySQL索引的真正存储结构) 三. 联合索引底层存储结构 一 理解索引的特性 索引是帮助MySQL高效获取数据的排好序的数据结构 索引存储在文件里 二 索引的各种存储结构及其优缺点 在开始讲这一小节之前,我们先来看一... 阅读详情

相关推荐

MySQL之全文索引:深入理解与实战运用

在MySQL的学习与应用过程中,我发现全文索引是一个非常实用但又充满细节的功能。它在实现关键词搜索等场景中发挥着关键作用,但其中的自然语言索引、布尔索引以及不同版本的特性差异,都需要我们深入学习。今天就把这些知识分享出来,希望能和大家一起学习进步。

wj_rdk的博客 1386

Java怎么连接数据库 (使用技术及步骤原理,入门即会)

文章说明: 我们在这里讨论怎么去使用,了解它基本内容 ,认真看完 你就会了 连接时需要在 eclipse(idea) 加入它所需要的 jar包 依赖(下面讲为什么) 你可以从网盘下载 也可以去官网搜索 下载所需的版本 链接:https://pan.baidu.com/s/10nKrIf-e1gX9w0wYBAkbPQ 提取码:wf55 http://mysql-connector-java-5.1.23-bin.jar 一.连接时使用的技术 1...

qq_52252193的博客 3万+

相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例)

本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。

weixin_30687051的博客 455

java连接MySQL数据库教程(含详细代码)

你的MySQL是哪个版本就下载哪个版本相对应的包,例如我的是MySQL8,然后我这边选择下载8.0.28。然后选中导入的mysql-connector包,单击右键选择Add as Library,点击Ok。找到刚刚下载的jar包,右击选择复制,然后回到IDEA,单击选中lib包,直接Ctrl+V粘贴。点击要下载的版本,然后点击jar进行下载。然后打开IDEA,我们创建一个lib包。就可以把jar包粘贴到lib中。

m0_46555031的博客 1496

OpenClaw Browser Relay Extension 鉴权失败与 invalid handshake 问题的终极解决方案

在使用 OpenClaw 浏览器插件 (Browser Relay Extension) 时,许多用户可能会遇到两个主要问题:一是配置端口错误导致的连接失败,二是鉴权失败 (Gateway token rejected)。本文将详细解析这两个问题并提供解决方案。

gerryke的blog 5561

【AIOPS实战】Dify+Zabbix:构建智能告警分析助手的核心架构与实现

本文详细介绍了如何利用Dify平台与Zabbix-MCP接口构建智能告警分析助手,实现自然语言查询告警、智能分析和报告生成。该系统通过AIOPS技术显著提升运维效率,支持中英文混合查询、自动根因分析,并内置多种优化方案确保稳定可靠。

weixin_29238147的博客 319

java连接数据库的5种方式

一个疑问:为什么不写`Class.forName("com.mysql.cj.jdbc.Driver");

thulium_kyg的博客 9989

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 675

Java和数据库的连接

在Resultset中看到next()方法,一定用到Iterator迭代器,这个迭代器可以用next();java面向接口,提供了数据库的相关接口,每个不同的数据库厂家根据接口开发方法。Java使用数据库,调用对应接口的实现。注意:java 只出规范,其他的应用按照规范去开发,java在每一个规范中都有反射去找到相关的类。(6)根据mysql的数据类型与java 的数据类型的对应关系,使用对应的get方法,得出结果.在数据方法中,Connection中有方法close(),close()关闭。

qq_57289689的博客 1340

STM32实战开发(133):基于STM32的智能GPS定位跟踪系统开发

本文详细介绍了如何基于STM32开发一个智能GPS定位跟踪系统。系统使用NEO-6M GPS模块获取实时定位数据,并通过SIM800L GPRS模块将定位信息上传到远程服务器。通过OLED屏幕实时显示位置数据,使用SD卡存储历史轨迹,并提供蜂鸣器报警功能。项目实现了GPS定位数据的获取、解析、存储和传输,为智能定位系统提供了完整的解决方案。

2201_76125393的博客 1644

为什么先进工艺需要check那么多corner?

那么hold slack = launch clock path delay + data path delay - capture_clock_path_delay = -capture_clock_path_delay,也就是说,capture clock path delay越大,hold越难满足。而且,我们在设计的时候,一般clock频率都会过约,所以是有较大的margin的。有的foundry还会对rc的取值范围进行了约束,如cworst_T,采用的是1.5 sigma的取值范围。

芯冰乐 2089

JAVA连接mysql数据库。涵盖,各种方式,一篇解决所有问题!

String url="jdbc:mysql://localhost:3306/数据库名?Jdbc.url: jdbc:mysql://localhost:3306/你的数据库名称?url: jdbc:mysql://localhost:3306/你的数据库名称?driver-class-name: com.mysql.cj.jdbc.Driver //注意8版本的区别。Jdbc.username: root //你的用户名。

qq_42319810的博客 8949

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 385

【MySQL笔记】正确的理解MySQL的索引机制以及内部实现(一)

让我们一起学习大而复杂的数据库索引机制!尽量的做到全面且正确

长路漫漫的歇脚处 5565

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【MySQL进阶-03】深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR

深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR

zhenghuishengq的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【MySQL】索引

本篇文章详细讲解了MySQL索引的作用及其与磁盘存储的交互机制。首先,阐述了索引在数据库中的重要性,能够显著提高数据检索效率。接着,深入探讨了MySQL与磁盘存储的关系,以及MySQL与磁盘交互的基本单位——page。随后,通过详细解析索引的理解过程,包括单个page与多个page的理解、页目录的引入、B+树的选择等,让读者深入理解索引的底层原理。此外,文章还介绍了索引的创建、查询、删除操作,并给出了索引创建的实用原则。

是阿建吖! 2582

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[MySQL] MySQL中的索引

在MySQL中,索引是一种数据结构用于提高查询效率和加速数据检索。创建索引可以加快数据库中表的查询操作,减少查询所需的时间和资源消耗。但是天下没有免费的午餐,。所以它的价值,在于提高一个海量数据的检索速度。到这里你可能依然对索引的概念是一种模糊的状态,后文我们会详细解释。看会此篇文章再来回头看索引的概念,相信你就会理解了。

weixin_67596609的博客 2242

【Mysq】深入理解Mysql索引底层原理的实现

文章目录

Lebron 4465

【MySQL】深入理解MySQL索引原理(MySQL专栏启动)

本篇文章博主对索引做了一个较为初步地概述,主要有2种主要的索引的数据结构b+tree和hash的数据结构,b+树的覆盖索引和回表进行分析,并对b+树存放记录、如何优化B+树索引的插入性能进行分析。

小明的Java问道之路 4475

深入理解MySQL InnoDB索引:从聚集索引到全文索引实践指南

在MySQL数据库中,索引是提升查询性能的核心组件,而InnoDB作为MySQL默认且应用最广泛的存储引擎,其索引机制直接决定了业务系统的读写效率。本文将从InnoDB索引的基础——聚集索引入手,逐步剖析辅助索引、唯一索引、联合索引、前缀索引及全文索引的结构、特点与实践方法,结合具体SQL示例帮助大家掌握索引的本质与应用场景。

专注Java和MySQL领域知识分享 1111

深入理解mysql索引

索引是数据库中至关重要的一部分,它能够显著提升数据检索的效率。本文将带你深入了解 MySQL 索引的概念、作用、优缺点、使用场景、底层数据结构以及最佳实践。

fouryears_23417的博客 1041

MySQL索引优化系列:(一)索引的类型

MySQL 是最流行的关系型数据库管理系统,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS

菜菜bu菜的博客 1639

深入理解Mysql索引及其物理存储

存储引擎相对于内模式。

Joy T的博客 1432

MySQL索引优化:深入理解索引合并

Index Merge Optimization 是 MySQL 查询优化器在处理复杂查询时的一种强大工具。它允许数据库在单个查询中高效地利用多个索引,从而显著提高查询性能。然而,它并不总是被使用,优化器会根据查询的具体情况和成本估算来选择最佳的执行计划。索引合并是MySQL优化复杂查询的一种强大技术。它允许数据库利用多个索引来加速查询,从而提高性能和响应速度。在设计数据库和编写查询时,了解并合理利用索引合并策略,可以帮助我们构建更高效、更可扩展的应用程序。

码到三十五 2322

MySQL高阶教程索引

导语:本教程是笔者用mysql做了一年多简单的开发后,对MySQL有了一定的理解,为了夯实自己的MySQL数据库基础,对MySQL进行了二次学习,期间记下了很多笔记,本教程即是以这些笔记为大纲,内容详尽,理论和实战相结合。如果觉得自己对MySQL的了解不够深入,可以阅读文中的知识概念,并亲手敲一遍文中的实例代码,走完整个教程之后,一定会让自己对MySQL有更加深刻的理解! 本篇文章为整个教程的索引部分,可以在这里看到所有文章的层次关系,或者下载文章中使用的数据库SQL文件。 一、M...

待到春花烂漫时 6815
上一篇: SpringBoot使用总结
下一篇: Docker-常用命令总结
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值