MYSQL的索引

1、概念

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

形成:当我们建立一个表的时候,无论如何肯定会有索引。如果我们建立的时候设置了主键、唯一键、普通索引等,MYSQL会生成两个文件,一个是专门存数据的文件,另一个是索引文件(里面存储了索引结构);如果一开始我们没有设定主键、唯一键、普通索引等,MYSQL内核会自动生成一个索引列,也就是还会默认生成一个索引文件,只不过对我们是隐藏的。

2、底层结构

其实很早的时候,在学校学习的数据库的时候,老师在介绍索引的时候,会把索引比喻成书的目录,找一本书里的内容通过目录即可快速定位到我们要查找的内容,如果没有目录,我们寻找内容需要一页一页的寻找。这个比喻有一部分对,不过当时老师也是为了便于我们理解而这样比喻,其实数据库的索引比目录要复杂一些。

在早期的MYSQL,也就是MYISAM引擎是使用的B树去实现索引的,后来的INNODB引擎使用的是B+树去实现的。接下来分别介绍这两个结构。

2.1、B树结构

2.1.1、概念

结构:B数是一个类似二叉搜索树的树,但是它是一个多叉树。每一个结点都表示很多个范围,每一个结点的大小为16K,也就是一个页(一个页由4个块组成,一块是4K),每一个结点存放索引的范围 和 指向对应的下一层结点的指针;然后每层树层层划分,越往下,范围就越细,而最后的叶子结点就是我们要的数据地址的范围(注意,这是范围,而不是一个数据),注意,这里存的是数据地址,也就是磁盘的数据文件里这一个范围的数据的磁盘地址。
整体,B树是一个绝对平衡的树,B树及其所有的子树的平衡因子是0,也就是是所有子树的左右子树的高度是一样的。
查找:一开始把根节点从磁盘读到内存,然后从根节点找对应的范围,继续找到数据所以在范围的下一个结点,然后将这个结点读到内存,… … 以此类推,每一次读取到内存都是一次磁盘的IO。然后最后找到根节点,将根节点加载到内存(注意,根节点存的是数据范围),然后通过一定的算法(如二分查找),找到对应的数据,然后会有该数据对应的磁盘的数据文件里数据的地址,最后通过地址即可拿到该索引对饮管道所有数据。

2.1.2、实例

比如有这样的一张表,其中学号是主键:在这里插入图片描述
因此我们接下来说一下由主键索引的这个表构建的底层的B树的结构:

在这里插入图片描述

2.1.2.1、结构

第一层,存的是结点索引的范围,存放的结点的范围表示的是:1、170 <= x < 174 ,2、174 <= x < 178 ,3、178 <= x 。每个结点都会指向下一层的结点。
第二层,存的是结点索引的范围,存放的结点的范围表示的是:1、170 <= x < 172 ,2、172 <= x < 174 ,3、174 <= x < 176 ,4、176 <= x < 178 , 5、178 <= x 等等。每个结点都会指向下一层的结点。
第三层:存的是数据的范围,存放的结点的范围表示的是:1、170 <= x < 171 ,2、171 <= x < 172 ,3、172 <= x < 173 等等。

每个索引结点存放:1、索引数据的范围,2、每个范围对应的下一个结点的指向
每个数据结点存放:1、索引数据,2、对应数据在磁盘的数据文件里数据地址

2.1.2.2、查找流程

比如我们查找173学号的数据。

1、先从索引文件将根节点加载到内存。
2、通过根节点发现173是 >= 170 && < 174,所以我们走最左边的指针,将最左边指向的结点加载到内存。
3、再通过加载的这个结点寻找173,发现173是 >= 172 && < 174的,所以我们走右边的指针,并将这个指向的数据结点加载到内存。
4、这时候通过二分查找,快速的找到对应的数据,然后通过数据对应的磁盘的地址,访问到数据文件里对应的数据。

2.1.3、总结

从上面的实例,我们可以看出B树的效率还是很高的,看了这个结构有些人会想:既然是多叉树,那么为什么不只用一个结点,也就是为什么不用一个结点来表示所有数据的范围呢?

原因是:如果数据量特别大,那么这个索引结点也将特别大,这个索引结点是要加载到内存的,所
以是很吃内存的,有些甚至没法加载进去。如果用一定量的结点就不会发生这种情况,我们将一个结点加载到内存后,通过这个结点找到下一个结点后,会将之前的结点从内存中删掉,然后再加载新的结点(因为之前的结点的任务已经完成了,没有用了),这样就均衡了性能和内存。

上面的例子是查找某一个数据,但是如果我们查找的是一个范围的数据呢?比如我们要查找173 ~ 175的数据,它的查找流程会变成:
1、加载根节点
2、逐级往下加载结点
3、找到173的数据
4、然后这里是麻烦的,因为174 ~ 175不在这个数据结点,所以我们得重新加载根节点,再按照上面的流程找174 ~ 175。

这个就大大增加了磁盘IO的次数,我们知道磁盘IO的效率并不高,因为这个,MYSQL后来升级了B树,称为B+树。

2.2、B+树结构

2.2.1、概念

结构:其实B+树和B树整体结构是基本相同的,B+树升级的是:1、每一层的结点都多了一个指针,这个指针指向同一层的下一个结点,这个指针就是为了提高范围查找的效率。2、B树的数据结点存的是索引数据及其对应的磁盘地址,而B+树存的是索引数据及其对应的所有数据,这也是为了提高性能,减少了磁盘的IO,虽然存的量多,但是每次只加载一个结点,前面的结点就会删除,所以其实差的不多。(B树的是非聚簇索引,B+树的是聚簇索引)。
查找:找一个数的时候,B+树的流程和B树是一样的,不同的是查找范围时候的流程。如果查找的是范围数据,会将其他数据的结点通过最后一个指针找到(而B树还需要从根节点重新找),最后找到根节点,就直接从根节点就可以拿到所有的数据(而B树还需要再一次的磁盘IO,通过磁盘地址找到对应的数据)。

2.2.2、实例

同样使用上次的表结构及其数据,不同的是树结构:
在这里插入图片描述

2.2.2.1、结构

B+树的结构大体和B树的结构是相同的。
第一个不同的是每一个结点后面都有一个指向本层下一个结点的指针,这个目的是为了让范围查询更加便捷;
第二个不同的是最后的根节点,也就是数据页,里面存的不再是数据的磁盘地址,而是该索引对应的所有数据。

2.2.2.2、查找流程

比如我们还是查找范围是173 ~ 175的数据:
1、先将根节点加载到内存,先去找最小数173,在>= 170 && < 174的范围。
2、将最左边指针指向的结点加载到内存,继续寻找173,在>= 172 && < 174的范围。
3、将最右边指针指向的结点加载到内存,里面只有一个173的数据页,然后通过最后的指针拿到其指向的结点,也就拿到了174 ~ 175的数据页。
4、直降从这两个数据页读取数据即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全扫描。可以使用OPTIMIZE TABLE命令来优化索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值