MySQ的索引Innodb

本文深入探讨了MySQL InnoDB存储引擎的索引结构,包括页大小、行格式、聚集索引和非聚集索引。讨论了如何计算索引能容纳的数据量,以及如何处理超过一页大小的行数据。还提到了冗余和紧凑行格式的存储特性,以及行级锁定和页外列的概念。
摘要由CSDN通过智能技术生成

1.查看索引默认容量

执行命令,查看索引页的默认大小,单位为B。(1KB=1024B)

SHOW GLOBAL STATUS LIKE 'innodb_page_size';
+----------------+-----+
|Variable_name   |Value|
+----------------+-----+
|Innodb_page_size|16384|
+----------------+-----+

查看表的默认信息

select * from information_schema.TABLES where TABLE_SCHEMA = 'zoo' and TABLE_NAME = 'cat';

zoo:zoo为库名

catcat为表名

精简一下结果

select ENGINE,TABLE_ROWS,AVG_ROW_LENGTH,DATA_LENGTH,MAX_DATA_LENGTH,INDEX_LENGTH 
from information_schema.TABLES
where TABLE_SCHEMA = 'zoo'
and TABLE_NAME = 'cat';

+------+----------+--------------+-----------+---------------+------------+
|ENGINE|TABLE_ROWS|AVG_ROW_LENGTH|DATA_LENGTH|MAX_DATA_LENGTH|INDEX_LENGTH|
+------+----------+--------------+-----------+---------------+------------+
|InnoDB|129       |889           |114688     |0              |32768       |
+------+----------+--------------+-----------+---------------+------------+

AVG_ROW_LENGTH:平均行长度

DATA_LENGTH:数据文件的长度,字节为单位。

INDEX_LENGTH:分配给非聚集索引的近似空间量(以字节为单位)。具体而言,它是非聚集索引大小(以页为单位)乘以页面大小的总和

2.计算索引容纳的数据

三层树。

请添加图片描述

第一层:一个page大小16K(可以配置,默认16K),主键bigint为例子,一个主键大小8B(字节),对象头6B(存储下一层索引地址),一个page的索引数量为16*1024/(8+6)=1170个。

第二层:每个元素都延申出一个page:1170*1170

第三层:放数据了 16K/每条的size,假设行数据是1K的话 。三层相乘 1170*1170*16=21,902,400

行数据大小最大为page的一半,64K为16K,因为有页外列。最小为 1170*1170*2=2,737,800

主键大小m,数据大小n,page大小为16K,通用公式为:

row=16*1024/(m+6)

row=row*row*(16/n)

***注意:***该数据为默认配置下的估值,跟行数据大小关联比较紧密。

冗余行格式存储特性

行格式具有以下存储特征:REDUNDANT

  • 每个索引记录都包含一个 6 字节的标头。标头用于将连续记录链接在一起,并用于行级锁定。
紧凑行格式存储特性

行格式具有以下存储特征:COMPACT

  • 每个索引记录都包含一个 5 字节的标头,其前面可能有一个长度可变的标头。标头用于将连续记录链接在一起,并用于行级锁定。

MySQL :: MySQL 8.0 参考手册 :: 15.10 InnoDB 行格式

查看索引高度

MySQL查看 InnoDB表中每个索引的高度 - waterystone - 博客园 (cnblogs.com)

查看MySQL InnoDB 表索引的高度_衣舞晨风-CSDN博客

3. 聚集索引

每个表都有一个称为聚集索引的特殊索引,用于存储数据。通常,聚集索引域主键同义。

原文如下。

Each InnoDB table has a special index called the clustered index that stores row data. Typically, the clustered index is synonymous with the primary key.

聚集索引外的索引称为二级索引。二级索引中的每条记录都包含行的主键列,以及二级索引指定的列。如果主键很长,则二级索引会占用更多空间,短主键是有利的。

3.1 默认16K的page,怎么存的下行超过16K的数据?

对于 4KB、8KB、16KB 和 32KB设置,最大行长度略小于数据库页大小的一半。例如,对于默认的 16KB 页面大小,最大行长度略小于 8KB。对于 64KB 置,最大行长度略小于 16KB。

如果行不超过最大行长度,则所有行都将存储在本地页面中。如果行超过最大行长度,则选择可变长度列作为页外列(off-page)存储,直到该行符合最大行长度限制。

可变长度列:

  1. varchar、varbinary、blob、text类型是可变长度类型。
  2. InnoDB将长度大于或等于768字节(B)的股低昂长度字段视为可变长度字段。例如,如果字符集的最大字节长度大于 3,则列可以超过 768 个字节,就像 CHAR(255) utf8mb4

页外列/离页列 office-page:包含可变长度数据的列,该列太长而无法放在B+树页上。存储在溢出页overflow pages上。

溢出页 overflow pages:单独分配的磁盘页,不在B+树的页上。

15.6.2.1 Clustered and Secondary Indexes(聚集索引和二级索引)

8.4.7 Limits on Table Column Count and Row Size(对表列计数和行大小的限制)

15.11.2 File Space Management(文件空间管理)How Pages Relate to Table Rows(页面与表行的关系)

variable-length type(可变长度类型)

overflow page(溢出页)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程还未

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值