【MySQL】索引特性

article/2025/7/23 8:29:42

文章目录

  • 一、初始索引
  • 二、MySQL与储存
  • 三、软件理解
  • 四、Page
  • 五、聚簇/非聚簇索引
  • 六、索引操作
    • 1.创建主键索引
    • 2.创建唯一索引
    • 3.创建普通索引
    • 4.查询索引
    • 5.删除索引

一、初始索引

索引的核心工作是提高数据库性能的,MySQL的服务器,本质是在内存中的,所有数据库的CURD操作,全部都是在内存中进行的,索引也是如此。影响算法效率的因素有两个:组织数据的方式和算法本身。索引就是更改数据组织的方式,从而提高算法效率。

索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的
create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度

二、MySQL与储存

在这里插入图片描述
数据库文件,本质就是保存在磁盘的盘片中,也就是上面的一个个扇区中,数据库文件很大,因此会占据多个扇区。定位一个扇区需要知道柱面-磁头-扇区,系统读取磁盘,是以块为单位的,而不是扇区,基本单位是4KB。磁盘随机访问是本次IO给出的扇区地址和上次的扇区地址不连续,磁头需要较大移动动作才能重新开始读写,尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随机访问,而非连续访问。

三、软件理解

MySQL作为一个应用级软件,可以想象成一种特殊的文件系统,它有着更高的IO场景,为了提高IO效率,MySQL进行IO的基本单位是16KB,这个基本数据单元,在MySQL里叫做page

MySQL 将数据以页(page)为单位存储在磁盘中。在执行增删改查(CURD)操作时,系统需要通过计算来定位数据插入位置,或查找待修改、查询的具体数据。

而只要涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中。所以在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新策略,刷新到磁盘。而这时,就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单位就是Page。

为了更好的进行上面的操作, MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称为 Buffer Pool 的的大内存空间,来进行各种缓存。其实就是很大的内存空间,来和磁盘数据进行IO交互。总之就是一句话:为了更高的效率,一定要尽可能的减少系统和磁盘IO的次数在这里插入图片描述

四、Page

当我们向一个具有主键的表中乱序插入数据后,我们会发现数据会自动排序。理解这个现象前,我们先重谈一下page。在MySQL内部一定会同时存在大量的page,因此MySQL会对其进行管理,这样一来page就不仅仅是一个大一点的内存块了,page内部也必须写入对应的管理信息struct page,就像:

struct page
{struct page* next;struct page* prev;char buffer[NUM];
};
//---16KB

申请page其实就是new page(),将所有page用“链表”(或其他结构)管理起来,这就是在buffer pool内部,对MySQL中的page进行了一个建模。

MySQL 采用 Page 方案进行磁盘 IO 交互,主要基于以下考虑:

假设需要查找 id=2 的记录,如果采用逐条加载的方式,第一次加载 id=1,第二次加载 id=2,需要 2 次 IO。若查找id=5,则需要 5 次 IO。这种逐条加载的方式会导致 IO 次数显著增加。

而采用 Page 方案时,假设这 5 条记录(或更多)都存储在一个 16KB 的 Page 中,查找 id=2 时,整个 Page会被一次性加载到 MySQL 的 Buffer Pool 中,仅需 1 次 IO。后续查找 id=1、3、4、5等记录时,可以直接在内存中完成,无需额外 IO。这种方式显著减少了 IO 次数。

你可能会问:如何确保用户下次查找的数据就在这个 Page 中?虽然无法严格保证,但根据局部性原理,这种可能性很大。程序在执行时往往具有空间局部性和时间局部性,即相邻的数据很可能被连续访问。 此外,IO 效率低下的主要瓶颈通常不是单次 IO 的数据量大小,而是 IO 的次数。通过 Page 方案,可以有效减少 IO次数,从而提升整体性能。

因为有主键,MySQL 会默认按照主键给我们的数据进行排序,从Page内数据记录可以看出,数据是有序且彼此关联的,但是如果page间按照下图的链表结构,查找特定的一条记录就是线性遍历,这样的话效率就太低了:
在这里插入图片描述
此时就要引入页目录这一概念了,一本书拥有目录,便于在一本书中进行快速查找。针对上述的单页Page,我们也可以引入目录:
在这里插入图片描述
从这里我们就明白为什么MySQL会通过键值来自动排序了,就是为了更方便地引入目录

但这里只是解决了Page内部查询的问题,而Page之间仍然是线性的,若Page很多的情况下效率仍然是存在问题的,按照之前解决问题的思路,我们可以也给Page带上目录。
在这里插入图片描述
在这里插入图片描述
当然我们还能给页目录再向上加一个页目录,如下图所示,这个结构其实就是B+树。叶子节点保存数据,而非叶子节点不存数据,因此可以存储更多的目录项,这样就能管理更多的page,宏观上看这颗树就是一个矮胖型的树,这样的形状意味着从顶到底路径上的节点是很少的,找到目标数据只需要更少的Page,从而IO次数也减少,提高了效率。

同时叶子节点是用链表级联起来的,这是B+树的特点,这么设计的原因就是为了进行范围查找,这样就不用每次查找都从顶开始。
在这里插入图片描述这整个结构叫做MySQL InnoDB下的索引结构,我们已经完成了主键索引。一般我们建表插入数据的时候,就是在该结构下进行增删查改,就算我们的表没有主键,MySQL也会自动生成一个隐藏列来充当主键。

其他数据结构为什么不适合?

1.链表:线性遍历,效率低
2.二叉搜索树:“瘦高状”,从顶到底遇到的节点(IO次数)较多,而且极端情况下会退化为线性结构
3.AVL&红黑树:虽然是近似平衡,但形状仍然不变,层数是比B+树高的,B+树更加适合
4.Hash:?官方的索引实现方式中, MySQL 是支持HASH的,不过 InnoDB 和 MyISAM 并不支持,Hash跟进其算法特征,决定了虽然有时候也很快(O(1)),不过,在面对范围查找就明显不行
5.B树:B树的非叶子节点存了数据,意味着整体形状更高瘦,IO效率较低,并且非叶子节点是没有级联的,范围查找也不方便

五、聚簇/非聚簇索引

MyISAM存储引擎同样也是使用B+树作为搜索结果,但叶节点存放的是数据的地址,这就是MyISAM的最大特点,索引Page和数据Page分离,即叶节点也没有数据,只有数据对应的地址,这种用户数据和索引分离的索引方案叫做非聚簇索引
在这里插入图片描述
而InnoDB这种用户数据和索引数据放在一起的的索引方案叫做聚簇索引,当然MySQL除了默认会建立主键索引外,我们用户有可能建立其他列信息建立的索引,一般这种索引可以叫做辅助索引,对于MyISAM而言辅助索引和主键索引没有区别,无非是主键不能重复而非主键可以重复而已。而对于InnoDB而言,非主键索引的叶子节点中并没有数据,只有对应记录的Key值,所以通过辅助索引,找到目标记录,需要两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。这种过程,就叫做回表查询,为什么不给辅助索引的叶子节点也给上数据呢?原因就是太浪费空间了。
在这里插入图片描述

六、索引操作

索引创建规则

1.比较频繁作为查询条件的字段应该创建索引
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件,如性别
3.更新非常频繁的字段不适合创建索引
4.不会出现在where子句中的字段不该创建索引

1.创建主键索引

#方法一
create table user1(id int primary key,name varchar(30));
#方法二
create table user2(id int,name varchar(30),primary key(id));
#方法三
create table user3(id int,name varchar(30));
alter table user3 add primary key(id);

主键索引的特点:

1.一个表中最多只有一个主键索引
2.主键索引效率高,因为主键不可重复

2.创建唯一索引

#方法一
create table user4(id int primary key,name varchar(30) unique);
#方法二
create table user5(id int primary key,name varchar(30),unique(name));
#方法三
create table user6(id int primary key, name varchar(30));
alter table user6 add unique(name);

唯一索引的特点:

1.一个表中可以有多个唯一索引
2.查询效率高

3.创建普通索引

#方法一
create table user8(id int primary key,
name varchar(20),
email varchar(30),
index(name) --在表的定义最后,指定某列为索引
);
#方法二
create table user9(id int primary key, name varchar(20), email varchar(30));
alter table user9 add index(name); --创建完表以后指定某列为普通索引
#方法三
create table user10(id int primary key, name varchar(20), email varchar(30));
-- 创建一个索引名为 idx_name 的索引
create index idx_name on user10(name);

普通索引的特点:

1.一个表中可以有多个普通索引,在实际开发中用的比较多
2.如果某些列需要创建索引,同时该列有重复的值,那么就该使用普通索引

4.查询索引

在这里插入图片描述

5.删除索引

在这里插入图片描述


http://www.hkcw.cn/article/YqydAecdgs.shtml

相关文章

机器学习----决策树

一、决策树简介 from sklearn.tree import DecisionTreeClassifier from sklearn.tree import plot_tree 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果。 决…

天问二号问天之旅第一站拜访谁 探秘地球准卫星

我国行星探测工程天问二号探测器在西昌卫星发射中心成功发射,开启了“问天”之旅。这次任务的目标之一是小行星2016HO3。根据命名规则,这个名称包含了发现年份、时间段和顺序的信息。选择探测小行星2016HO3的原因在于它保留了太阳系诞生之初的原始信息,是研究太阳系早期物质…

WebStorm创建文件和目录

目录 创建文件和目录创建空文件从模板创建文件创建目录 创建文件和目录 创建空文件 在“项目”工具窗口中,选择要在其中创建文件的目录,按 Alt Insert,然后从列表中选择“File”。在打开的“New File”对话框中,输入文件名和扩…

【js逆向】信息公示平台搜索滑块逆向

目标:实现搜索后,滑块验证,得到结果。 网站:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdMaXN0 1. 输入搜索关键字,触发滑块验证 a和b后面要用到的参数,c中的cutImage和oriImage是背景和缺口…

笔试模拟 day16

观前提醒: 笔试所有系列文章均是记录本人的笔试题思路与代码,从中得到的启发和从别人题解的学习到的地方,所以关于题目的解答,只是以本人能读懂为目标,如果大家觉得看不懂,那是正常的。如果对本文的某些知…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月1日第95弹

从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀4-5个和值,可以做到100-300注左右。 (1)定…

AgentThink:在自动驾驶的一个统一框架,视觉-语言模型中工具增强的思维链推理

25年5月来自清华大学、Mcgill大学、小米公司和 Wisconsin(Madison)大学的论文“AgentThink: A Unified Framework for Tool-Augmented Chain-of-Thought Reasoning in Vision-Language Models for Autonomous Driving”。 视觉语言模型 (VLM) 在自动驾驶…

印度男子泰国景区摸老虎屁股遭扑咬 不当抚摸惹怒老虎

近日,一名印度游客在泰国普吉岛的热门景点被老虎袭击。视频中能听到现场惨叫声不断,拍摄画面也变得晃动模糊。据视频发布者称,该男子受了轻伤,成功逃脱。有网友指出,猫科动物通常不喜欢被抚摸背部尤其是靠近臀部的位置,这种行为可能让老虎感到不适。在泰国一些景区,游客…

进程信号简述

01. 信号产生 生活中的信号类比(交通信号灯、警报),当产生这些信号时,我们会立马想到对应的动作。在Linux中,信号是事件发生对进程的通知机制亦称软件中断,由操作系统内核、进程本身或者其他进程向目标进程异步事件发送机制(即收…

庖丁解牛BLIP2

庖丁解牛BLIP2 更好的阅读体验,欢迎访问 庖丁解牛BLIP2 获得 论文: https://arxiv.org/abs/2301.12597 代码: https://github.com/salesforce/LAVIS/tree/main/projects/blip2 背景 多模态模型在过往发展的过程中,曾有一段时期一直在追求更大的网络架构…

中国女排世界联赛北京站名单出炉 18名运动员备战

2025世界女排联赛北京站将于6月4日至8日在北京国家体育馆举行,参赛队伍包括中国、土耳其、波兰、比利时、泰国和法国。中国排协于6月2日公布了参加北京站比赛的中国女排名单,共有18名运动员。主攻位置有吴梦洁、庄宇珊、唐欣、董禹含;副攻位置有王媛媛、万梓玥、单琳倩、陈厚…

乌克兰摧毁41架俄军战略轰炸机 乌方称“蛛网”行动成功

乌克兰安全局内部人士透露,代号“蛛网”的特别行动历时18个月的策划和实施,成功摧毁了41架俄军战略轰炸机。此次行动由泽连斯基亲自协调,安全局局长马柳克率队直接执行。知情人士称,该行动在后勤保障方面极具挑战性,包括通过秘密渠道向俄境内输送FPV无人机,并转运移动木制…

张家界溶洞垃圾堆7层楼高 谁该脸红 多年排污为何无人察觉

近日,有博主发布视频称张家界市慈利县一处天然溶洞遭人为排污,导致宝贵的溶洞变成“粪坑”。视频显示,溶洞内出现黄绿色液体。该溶洞位于通津铺镇长峪铺村杨家坡,系喀斯特地貌,垂直深度约150米,洞内存有陈年垃圾和污水,近期因暴雨导致洞内污水上涨外溢入溇水。据拍摄的网…

中国代表香会反驳对华无端指责 坚决抵制煽动对抗

针对美西方等个别国家在新加坡香格里拉对话会上对中国的无端指责,中国人民解放军国防大学代表团团长胡钢锋表示,不接受对中方的无端指责,有关内容无中生有,煽动对抗,企图搞乱亚太,不得人心,也不可能得逞。责任编辑:zhangxiaohua

河南七旬老人捡烟花被崩伤 意外引发广泛关注

5月31日,河南平顶山鲁山县发生一起意外事件,一位7旬老人在捡拾烟花筒时头部被崩伤。此事被目击者拍摄并上传网络后引起广泛关注。老人的亲属杨先生透露,医生表示老人右眼无法保住,脑部也受了伤,后续治疗费用预计近10万元。目前,老人仍在鲁山县人民医院重症监护室接受观察…

三层交换机模拟搭建实际网络实验

1、某企业,下有5个部门,分别是市场部16人、财务部22人、生产部110人、研发部24人、行政部28人门。现向运营商申请了一段ip地址:100.xxx.1.0/24(XXX 为学生学号中的唯一标识部分),如果你是该公司的网管&…

在哈佛毕业礼演讲的中国女孩谈古诗 传递多元包容理念

中国女孩江玉蓉在哈佛毕业典礼上发表演讲,传递多元包容理念。当地时间5月29日,她在哈佛大学的毕业典礼上作为毕业生代表之一发言,引起广泛关注。江玉蓉来自中国青岛的一个普通家庭,通过不懈努力和自身天赋,获得了威尔士卡迪夫一所高中的全额奖学金,并在杜克大学完成了本科…

Baklib赋能企业内容中台构建

Baklib构建内容中台路径 Baklib作为智能内容管理工具,通过多终端适配系统将企业分散的知识资产进行云端聚合,形成统一的内容资源池。其用户需求分析引擎可深度解析访问行为数据,帮助企业快速定位核心知识模块,例如产品文档、培训…

美防长香会炒“中国威胁”有何企图 转移负面舆情

美国国防部长赫格塞思于5月31日在新加坡参加香格里拉对话会时发表讲话,极力渲染所谓“中国威胁”,以推动盟国增加军费开支。分析人士认为,赫格塞思此举可能是为了转移外界对群聊泄密事件等负面舆情的关注。对于赫格塞思的涉华消极言论,中国外交部发言人回应称,台湾问题纯属…

恶意软件清理工具,让Mac电脑安全更简单

​你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…