mysql-索引(InnoDB) - springboot实战电商项目mall4j

springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)

java商城系统源码

mysql-索引(InnoDB)

InnoDB 会把存储的数据划分为若干个「页」,以页作为磁盘和内存交互的基本单位,一个页的默认大小为 16KB,它由七部分构成:

File Header: 页的通用信息

Page Header: 页的专有信息

Infimum + Supremun: 系统生产的记录,存储页内最大和最小的记录

User Records: 存储用户记录

Free Space: 页中为使用的空间

Page Directory: 存储页中记录的位置

File Trailer: 校验页是否完整

// 查看页的大小(单位:字节)
show status like 'innodb_page_size';
页的数据数据排序主要是依靠表的主键id,这也是创建表的时候建议要创建一个主键,但这并不是强制性,实际创建表的过程中会发现没有指定主键也能成功的创建一个表,其实用户没有指定主键的时候,InnoDb每一列的进行循环试图逐列去寻找一列所有元素都不重复的作为主键,如果实在找不到InnoDn就会维护一个隐藏列来作为主键。
为什么创建表的时候会推荐使用整型的自增的主键?首先数据在页中是以单向链表的方式进行存储,如果使用uuid之类的作为主键,其本身是无序的而数据在页中的存放是有序的,所以在每次进行插入的数据根据排序规则大概率会在链表的中间,如果这时该页的大小已满16k,就需要根据插入的数据来重新调整后续页的数据;与之相比使用整型的自增的主键就具有很明显的优势了,因为自增的性质在正常情况下新插入的数据的主键id会大于上一条数据的主键id而直接插入到链表末尾的位置,所以新的数据就不需要大规模的去调整已有页的数据。

页数据结构.png

在InnoDB中,表数据组织方式是主键聚集索引,并且因为一个表只能有一个主键, 所以也只能有一个聚集索引。其他索引的结构则是通过索引键值加主键值组合来唯一确定一条记录,这些数据在逻辑上连续的,但从从物理存储结构上来看,聚集索引的存储并不是连续的。这其中有两点:

1、叶子节点中包含着列的数据,并且是通过双向链表进行链接的,而页按照主键的顺序排序;

2、每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储。

聚集索引其实就是主键索引,InnoDB中的数据是面向主键索引进行数据存储的。而聚集索引就是按照每张表的主键来构造一棵B+Tree,同时叶子节点中存储的是整张表的行记录信息,也可以将聚集索引的叶子节点称为数据页。因此,聚集索引的这个特性,决定了索引组织表中的数据也是索引的一部分。和B+Tree的数据结构一样,每个数据页都通过一个双向的链表来进行链接。需要着重注意的是,在InnoDB的B+Tree索引数据结构中,只有在叶子节点上存放的是完整的每行记录,而在非数据页的索引页中,存放的仅仅是主键值及指向数据页的偏移量,而不是一个完整的行记录。

主键索引.png
主键索引结构图

二级索引.png

​ 二级索引结构图

Mysql中的检索分为两种,一种是索引检索,还有一种是全表检索。在有索引时mysql会优先使用索引进行检索,没有创建索引或索引失效时使用全表检索,使用索引进行检索毫无疑问是会比全表检索的速度更快,但数据表每增加一个索引都要开辟出一片空间来存储B+树索引数据结构,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如一些字段可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
主键索引叶子节点中包含了列的数据,在进行检索时检索的字段不会导致索引失效,并且在范围检索时也能使用索引。而二级索引在检索时就需要注意检索的字段避免使用*,尽量只返回需要检索的数据。二级索引还能够通过联合索引来减少索引创建的数量,可以应在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,形成索引覆盖可以提高查询的效率。

springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)

java商城系统源码

26 声望
0 粉丝
0 条评论
推荐阅读
JS任务机制 - springboot实战电商项目mall4j
springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)java商城系统源码1.介绍 {代码...} ​ 对请求回来的数据进行处理时会涉及到异步函数,而JS执行代码的时候会先执行同步任务,再执行异步任务。​ ...

mall4j1阅读 651

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.4k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.6k评论 10

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.1k评论 9

26 声望
0 粉丝
宣传栏