乐趣区

关于mysql索引: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 而直接插入到链表开端的地位,所以新的数据就不须要大规模的去调整已有页的数据。

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

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

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

汇集索引其实就是主键索引,InnoDB 中的数据是面向主键索引进行数据存储的。而汇集索引就是依照每张表的主键来结构一棵 B +Tree,同时叶子节点中存储的是整张表的行记录信息,也能够将汇集索引的叶子节点称为数据页。因而,汇集索引的这个个性,决定了索引组织表中的数据也是索引的一部分。和 B +Tree 的数据结构一样,每个数据页都通过一个双向的链表来进行链接。须要着重留神的是,在 InnoDB 的 B +Tree 索引数据结构中,只有在叶子节点上寄存的是残缺的每行记录,而在非数据页的索引页中,寄存的仅仅是主键值及指向数据页的偏移量,而不是一个残缺的行记录。


主键索引结构图

​ 二级索引结构图

Mysql 中的检索分为两种,一种是索引检索,还有一种是全表检索。在有索引时 mysql 会优先应用索引进行检索,没有创立索引或索引生效时应用全表检索,应用索引进行检索毫无疑问是会比全表检索的速度更快,但数据表每减少一个索引都要开拓出一片空间来存储 B + 树索引数据结构,如果一张表的数据量很大而符合条件的后果又很少,那么不加索引会引起致命的性能降落。然而也不是什么状况都非得建索引不可,比方一些字段可能就只有两个值,建索引不仅没什么劣势,还会影响到更新速度,这被称为适度索引。
主键索引叶子节点中蕴含了列的数据,在进行检索时检索的字段不会导致索引生效,并且在范畴检索时也能应用索引。而二级索引在检索时就须要留神检索的字段防止应用 *,尽量只返回须要检索的数据。二级索引还可能通过联结索引来缩小索引创立的数量,能够应在查问时有多个字段总是同时呈现则这些字段就能够作为复合索引, 造成索引笼罩能够进步查问的效率。

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

java 商城零碎源码

退出移动版