MySQL 索引

【100分】【等和子数组最小和】 逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。 阅读详情

MySQL 索引

索引的概述

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的示意图所示 :
图1没有建立索引
在这里插入图片描述
图2左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。
为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。

索引优势劣势

优势

  • 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。

劣势

  • 实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。
  • 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

索引类型

索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4种索引:

  • BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。
  • HASH 索引:只有Memory引擎支持 , 使用场景简单 。
  • R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。
  • Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。

MyISAM、InnoDB、Memory三种存储引擎对各种索引类型的支持

索引InnoDB引擎MyISAM引擎Memory引擎
BTREE索引支持支持支持
HASH 索引不支持不支持支持
R-tree 索引不支持支持不支持
Full-text5.6版本之后支持支持不支持

我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为 索引。

索引结构

图1没有建立索引
如图1有一个2列7行的数据表,这时要查着张表

select * from t where t.col2 = 89;

这段 SQL 语句要逐行把 col2 字段拿出来和 89 进行比较,要查找很多次才能查找到 89 的数据。
数据存储在磁盘中,每一次的比较就相当于做一次磁盘的 IO ,磁盘的 IO 是最慢的,如果数据少性能还可以,当数据量大的情况下性能将特别的慢,系统中 IO 就会被占满。

二叉树

在这里插入图片描述

如果这时候用到数据库的索引性能将大幅的提高(如图2)。
把 col2 字段存到二叉树(早起的 mysql 索引用过二叉树)中,在二叉树每一个节点上存 2 个东西,一个 key 另一个 value ,key 是 col2 字段的具体值,value 是数据所在磁盘中的文件地址(数据表的数据分布在磁盘中并不是按着进行存储的,大部分情况下是中间有间隔的),所以每次查找都相当于和磁盘做一次 IO 操作,所以效率是不高的。
如果把数据放到二叉树中,一般从根节点开始查找,大于根节点的在右面,小于根节点的在左面,所以 89 和 34 比较,看可以知道应该去右面的子节点进行查询,直接就可以查到 89,这个时候可以拿到这条数据在磁盘中的地址可以直接去磁盘中定位这条记录。
这种方式要比直接全部扫描快很多,只用了2次的磁盘 IO,减少了很多次的 IO。

二叉树所存在的问题

二叉树在某些场景下不是特别好的能满足索引高性能查找的要求。
比如说这个场景下,把图2 中的 col1 维护在二叉树中会出现什么效果?
在这里插入图片描述
插入 7 条数据,对应二叉树就维护了 7 个索引的记录,但是这时可以发现根本就不是一个树,已经退化成了一个类似于链表的数据结构了。
这个时候我们来查询刚才的 SQL 语句,这时查找 col1

select * from t where t.col1 = 6;

这时可以发现扫描了 6 次,对应做了 6次 的 IO,跟没创建索引一样,也是全部扫描一遍。
用二叉树最为索引的话用对于这种数据二叉树把它搞成了类似链表结构,没有起到快速查询减少 IO 次数的效果。
所以可以发现二叉树处理单边增长的数据不太适合作为索引的是数据结构

红黑树(二叉平衡树)

用红黑树把 col1 插入效果。

插入1
在这里插入图片描述

插入2
在这里插入图片描述

插入3
在这里插入图片描述

插入4
在这里插入图片描述

插入5
在这里插入图片描述

插入6
在这里插入图片描述

插入7
在这里插入图片描述

这个时候我们来查询刚才的 SQL 语句,这时查找 col1

select * from t where t.col1 = 6;

这时可以发现扫描了 3 次,对应做了 3次 的 IO,比刚才的二叉树要好上一些。

红黑树树所存在的问题

如果数据量特别大的情况下,比如 500W 条记录,树的高度假设是 20 层,这个时候红黑树弊端就会体现出来,500W 条记录都插入树里的话就会有层数太高的情况,对应的就是查找的时候层数也高,这时 IO 的次数就也会多,如果这时候恰好查询的记录在叶子节点上,就得消耗 20 次的 IO,才可以查询的到。
总结就是红黑树的高度太高了,查找层数太高,IO次数多。

B+Tree(多路平衡树)

现在可以针对红黑树优化一下
在这里插入图片描述

  • 在根节点中多放一些索引
  • 在每一个索引之间存放下一个节点的地址
  • 对应的下一个节点中也可以存放很多的节点,以此类推…
    同样是 500W 的数据,高度 <= 4 ,向红黑树的一个横向节点更多的存放元素,就可以减少红黑树的高度。
    我们上面所说的数据结构就是这次要介绍的BTree结构
    在这里插入图片描述
    这个BTree就是把单节点改为一个大的节点,大节点内有多个元素,元素和元素之前存放的是下一个节点的地址。
B+Tree特点

但是 MySQL 并不是完全用BTree,而是用B+Tree,如下图。
在这里插入图片描述

  • 把整张表的所有索引全部存放在叶子节点上
  • 叶子节点上都有都有数据
  • 非叶子节点是每一个下面大节点的第一个索引元素,实际上就是一些冗余索引
  • 所有节点元素放的顺序都是从小到大进行排序好了的
B+Tree查找过程

还是查询刚才的 SQL

select * from t where t.col1 = 30;

首先把根节点加载到内存中,在内存中和 30 进行比对,找到 15-56 之前的磁盘地址,接着把15-20-49这大节点加载到内存中,比对找到 20-30 的叶子节点,接着找到 30 的磁盘地址,从主键索引中进行回表查询到 col1 = 30 的全部记录。
mysql 默认会把根节点的数据存放到内存中,这参数是 innodb_page_size 默认是 160384 大小,也就是 16 kb,根节点元素如果是 bigint 类型占 8 byte,存元素的地址 mysql 底层分配 6 byte ,那么计算规则就是 16 kb ÷ (8 byte +6 byte) = 1170,也就是每个大节点可以放 1170 个元素。
叶子节点比较特殊 data 也是占用磁盘空间的,假设 data 占用1 kb(不同存储引擎占用大小不同,1kb 一般情况下错错有余),也就是说每一个叶子节点都是可以放 16kb ÷ 1kb = 16,每个叶子节点就可以放 16 个元素。
当B+Tree撑满了高度为 3 的情况下就能存放 1170 × 1170 × 16 = 21,902,400,也是都撑满的情况下,叶子节点就可以放下 2000 多万个索引。
MySQL 会把非叶子节点放到内存中,也就是每次查找大概会走 2-3 次的 IO,这样性能就会大幅度的提高。可以在 2-3 次的 IO 操作内完成千万级别的表操作。

Hash 索引

Hash 索引存储的节点也是 key-value 形式的,key 具体值,value 磁盘地址
在这里插入图片描述

Hash 索引特点
  • 对索引的 key 进行一次 hash 计算就可以定位出数据存储的位置
  • 很多时候 Hash 索引要比 B+Tree 索引更高效
  • 仅能满足 “=”,“IN”,不支持范围查询
  • hash 冲突问题

引擎分类

引擎分为聚集索引(聚簇索引)和非聚集索引
聚集索引:InnoDB
非聚集索引:MyISAM

文件形式

MyISAM

在这里插入图片描述

  • frm:表结构
  • MYD:表内的数据
  • MYI:表中的索引
    在这里插入图片描述
    MyISAM 的查询过程
select * from t where t.col1 = 30;

首先通过 B+Tree 索引(MYI 文件)查询到 col1 = 30 记录在磁盘中的地址,拿到地址后,通过地址去硬盘中(MYD文件)找到具体的数据

InnoDB

在这里插入图片描述

  • frm:表结构
  • idb:表内的索引和数据

主键索引结构(InnoDB 主键索引是聚集索引)
在这里插入图片描述

普通索引结构(InnoDB 普通索引是非聚集索引,叶子节点存的是主键id,查到了具体记录拿到id,需要回表通过主键索引查到指定数据的所有字段,所有查询的时候尽可能的减少回表操作,直接查出想要的信息,减少 select * 的使用)
在这里插入图片描述

索引设计原则

索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引

  • 对查询频次较高,且数据量比较大的表建立索引。

  • 索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合。

  • 使用唯一索引,区分度越高,使用索引的效率越高。

  • 索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然也就水涨船高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话,MySQL也会犯选择困难病,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。

  • 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效的提升MySQL访问索引的I/O效率。

  • 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。

(汇总篇)语义SLAM相关开源方案| 全球优秀作者与实验室 | SLAM学习资料整理 SLAM 与深度学习相结合的工作当前主要体现在两个方面,一方面是将语义信息参与到建图、位姿估计等环节中,另一方面是端到端地完成 SLAM。针对建图的工作一方面是利用几何信息进行稠密重建,另一方面很多工作利用语义信息达到了很好的语义重建效果,三维重建、SFM。动态 SLAM 也是一个很值得研究的话题,这里不太好分类,很多工作用到了语义信息或者用来三维重建,收集的方案相对较少。优化可能是 SLAM 中最难的一部分了吧 +_+ ,一般都是直接用现成的因子图、图优化方案,要创新可不容易。 阅读详情

相关推荐

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

MySQL的索引详细介绍(全网最详细!!!)

MySQL的索引详细介绍(全网最详细!!!)

qq_55846232的博客 1万+

ADS1220 STM32硬件SPI驱动程序

前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。

随风飘零翼的博客 5765

MySQL索引详解----看这一篇就够了

索引是数据库中用于加速数据检索的一种数据结构。它类似于书籍的目录,通过索引可以快速定位到数据的位置,而不需要扫描整个表。最左匹配原则是指在联合索引中,查询条件必须从索引的最左端开始,按照索引列的顺序依次匹配。如果查询条件没有从最左端开始,或者中间有列未匹配,索引将无法完全生效或部分失效。索引是MySQL中优化查询性能的重要工具。通过理解索引的结构、分类、使用方法和设计原则,可以显著提升数据库的查询效率。在实际应用中,需要根据具体的查询需求和数据特点,合理设计和使用索引。

秃头之旅 7063

SDM量化噪声等效到PLL输出的传递函数推导

在历年文章或书本中少见SDM量化噪声等效到PLL输出的传递函数推导。需了解SDM量化噪声的本质,配合欧拉方程简化,并将Z域转化成S域。最终结合断环处等效到PLL输出的传递函数,方可完成。

u010486560的博客 1406

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 479

MySQL中的索引

MySQL中删除索引使用ALTER TABLE或DROP INDEX语句,两者可实现相同的功能,DROP INDEX语句在内部被映射到一个ALTER TABLE语句中。提示 删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。可以看到,book表中已经没有名称为idx_aut_info的组合索引,删除索引成功。MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。先进行book_id条件的比较,然后再进行book_name比较,最后才是info。

qq_64064246的博客 1万+

[arcgis插件]在批量出图时,如何把图层属性表以动态表格的形式插入到布局页面

在批量出图时,如何把图层属性表以动态表格的形式插入到布局页面。

坐听风雨 4557

MySQL索引详解

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

zhaolk的博客 8888

LangGraph实战:用Python异步构建智能客服多轮对话系统(附完整代码)

本文详细介绍了如何使用LangGraph框架和Python异步编程构建一个高性能的智能客服多轮对话系统。通过将对话流程建模为有向图,结合thread_id实现多用户对话隔离,并利用异步节点提升系统并发处理能力,有效解决了传统客服系统上下文遗忘与高并发瓶颈问题。文章提供了从环境搭建、状态管理、异步优化到复杂业务逻辑与部署的完整实战代码。

weixin_29055137的博客 149

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2543

MySQL的索引

MySQL索引的使用、索引的分类、InnoDB索引模型、索引维护、最左前缀原则、覆盖索引、回表、索引下推、change buffer、普通索引和唯一索引的选择等等。

浅谈 8016

小麦病害检测系统开发

本项目旨在针对小麦病害小目标检测任务,在YOLOv11基础上进行三项改进: - 将主干网络替换为Swin Transformer,增强全局特征提取能力。 - 在检测头中引入DynamicHead,并增加检测头数量至四个,提升多尺度检测性能。 - 集成半监督FixMatch训练框架,利用无标签数据提升模型泛化能力。 我们定义五个模型进行对比实验: - Model 0: 原始YOLOv11 (有监督) - Model 1: YOLOv11 + Swin Transformer (有监督) ~~~~~~

AI的内部世界的博客 119

【MySQL】索引

介绍索引,建立MySQL与磁盘交换的基本单位的共识,深入理解索引,最后进行索引操作!

YoungMLet的博客 6501

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

MySQL —— 索引

介绍MySQL 的索引,索引的运作流程分析,索引的创建修改以及删除。

熵减玩家 3262

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySql 索引

MySql 索引底层原理和实现,MySql索引创建,删除,使用。

2301_76293625的博客 2307

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MySQL索引

MySQL系列: 1.了解索引 2.以B+树为索引数据结构的原因 2.1 Hash 索引 2.2二叉搜索树 (BST) 索引 2.3数据结构: N 叉树(例如 B 树) 2.4数据结构: B+ 树 2.5为什么 B+ 树是数据库索引的首选 3.MySQL页 3.1使用页的原因 3. 2页的结构概览 3.3页文件头和页文件尾 3.4页主体 3.5 页目录: 3.6数据页头 4.索引分类 4.1 主键索引(Primary Key Index) 4.2 普通索引(Secondary Index / Non-Uni

2401_85487314的博客 1207

MySQL——索引

MySQL、索引

2303_78442132的博客 1750

mysql索引年龄索引_MySQL索引

1.提升查询效率类似字典,比如:年龄为20的都在第几页,把20和页码都存放在索引中下一次查询时,不从第一页,一条一条的查询,而是根据索引信息快速的查询出数据。索引本身也要耗费存储空间的,跟字典中的拼音查询、部首查询占字典的页数一样。2.其他的增删改,效率降低索引还会浪费增删改效率,除了查询效率高了以外,其他的增删改效率都低了。(数据页的数据改动也需要改动索引页相对应的数据)3.MySQL索引类型3...

weixin_42631411的博客 1320

Mysql的索引

在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可。什么是mysql索引。

jdbcmeng的博客 1049
上一篇: viser 饼图修改颜色
下一篇: VO、DTO、DO、PO 的概念、区别和用处
bbccloud
博客等级 码龄11年 23粉丝 25原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值