InnoDB(6)索引页select --mysql从入门到精通(十一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: InnoDB(6)索引页select --mysql从入门到精通(十一)

上篇文章介绍了innoBD会有若干索引页,每个索引页的两个虚拟列,infimun最小虚拟行记录,supremun最大虚拟行记录,这两个存在innoDB的头部信息,里面还有delete_mark,next_record等。free space空间会给user records存储的数据申请,直到用完则会申请新的页。

InnoDB(5)索引页 --mysql从入门到精通(十)


Page directory(页目录)


我们现在知道记录页中的数据按主键从小到大的顺序组成一个单链表,那我们 查询单链表中的某一个数据该怎么办呢?


最原始(笨)的发方法,当然是从按顺序,从Infimum(最小)记录依次慢慢从小到大查找,这种还有一个好处是,当主键值大于要找的值时,后面的就不需要找了,因为后面的主键都是递增,说明没有要找的数据。那如果数据量太大这种查找显然不符合要求,如果你找字典,为了找一个字,从第一页翻到最后一页,这显然太消耗性能,于是字典有了目录,而我们 的mysql也有page directory。


每个index数据页有页目录,页目录有两个槽点,槽0放最小记录偏移量99和槽1放最大记录偏移量112(112实际就是指页面从0字节开始,数112个字节),最小记录的n_owned值为1,最大记录的n_owned值为5,包括最大记录本身是5条数据,所以我们实际插入4条数据。


innoDB对每个槽点分组规定:最小记录所在分组是一条记录,也就是最小记录,最大记录所在分组能拥有1~8条记录,剩下的范围都在4~8条记录。


所以插入数据的过程:


在初始化的时候,有两个槽点,最小槽点和最大槽点。

插入数据后,因为最小槽点只有一条数据,吧数据插入最大槽点,每次插入的时候,会吧当前槽点的n_owned值+1。当插入第9条数据的时候,分为两个槽点,这时候情况就是:三个槽点,最小槽点,槽0,槽1放4条记录,最大槽点,槽3 放5条记录。

INSERT INTO index_page_tb VALUES(5, 500, 'eeee'), (6, 600, 'ffff'), (7, 700, 'gggg'), (8, 800, 'hhhh'), (9, 900, 'iiii'), (10, 1000, 'jjjj'), (11, 1100, 'kkkk'), (12, 1200, 'llll'), (13, 1300, 'mmmm'), (14, 1400, 'nnnn'), (15, 1500, 'oooo'), (16, 1600, 'pppp');


为了方便查看,我们通过sql插入更多的数据,现在表里有16条真实数据,一共五个槽点(槽0到槽4),我们查询id为6的数据。low为0,最大槽high为4,用二分法查找。


所以查询数据的过程:


1、所以二分查找法(0+4)/2 = 2,槽2对应的主键为8,而8>6,所以继续找,此刻的参数low为0,high为2。

2、(0+2)/2=1,槽1对应的主键为4,4<6,此刻的参数low为1,high为2。

3、high-low为1,所以确定主键6 在槽2中,所以槽2 最大主键是8,因为每个槽都是挨着,槽1最大主键是4,所以槽2 最小主键是5,这时候只要从最小主键5来遍历这个槽,效率就会很高。

所以总结就是通过二分查找法找到对应的槽,之后从最小的主键遍历当前槽。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
102 9
|
4天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
16天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
57 18
|
9天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
38 8
|
9天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
51 7
|
15天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
20 7
|
14天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
46 5
|
18天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
89 7
|
25天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
52 9
|
4天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈