Dieser Artikel vermittelt Ihnen relevantes Wissen über InnoDB-Datenseiten in MySQL-Prinzipien, einschließlich relevantem Wissen über Seitenverzeichnisse, Seitenkopfzeilen und Dateikopfzeilen. Ich hoffe, dass es für alle hilfreich ist.
Es ist die Grundeinheit für InnoDB
zur Verwaltung des Speicherplatzes. Die Größe einer Seite beträgt im Allgemeinen 16 KB
. InnoDB
hat viele verschiedene Arten von Seiten
für verschiedene Zwecke entworfen, z. B. Seiten, die Tabellenbereichs-Header-Informationen und Insert Buffer
-Informationen speichern speichert INODE
-Informationen, die Seite, die Rückgängig
-Protokollinformationen usw. speichert. Natürlich, wenn Sie keinen der von mir genannten Begriffe gehört haben, denken Sie einfach, dass ich gefurzt habe. Aber es spielt keine Rolle, worauf wir uns heute konzentrieren werden Diese Seitentypen, die Datensätze in unseren Tabellen speichern, werden offiziell Indexseiten (INDEX
) genannt, da wir noch nicht verstanden haben, was ein Index ist, und in diesen Tabellen sind die Datensätze das, was wir nennen Daten
im täglichen Leben, daher nennen wir diese Seite, auf der Datensätze gespeichert werden, vorerst immer noch Datenseite
. InnoDB
管理存储空间的基本单位,一个页的大小一般是16KB
。InnoDB
为了不同的目的而设计了许多种不同类型的页
,比如存放表空间头部信息的页,存放Insert Buffer
信息的页,存放INODE
信息的页,存放undo
日志信息的页等等等等。当然了,如果我说的这些名词你一个都没有听过,就当我放了个屁吧~ 不过这没有一毛钱关系,我们今儿个也不准备说这些类型的页,我们聚焦的是那些存放我们表中记录的那种类型的页,官方称这种存放记录的页为索引(INDEX
)页,鉴于我们还没有了解过索引是个什么东西,而这些表中的记录就是我们日常口中所称的数据
,所以目前还是叫这种存放记录的页为数据页
吧。
数据页代表的这块16KB
大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:
从图中可以看出,一个InnoDB
数据页的存储空间大致被划分成了7
个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。下边我们用表格的方式来大致描述一下这7个部分都存储一些啥内容(快速的瞅一眼就行了,后边会详细唠叨的):
名称 | 中文名 | 占用空间大小 | 简单描述 |
---|---|---|---|
File Header |
文件头部 |
38 字节 |
页的一些通用信息 |
Page Header |
页面头部 |
56 字节 |
数据页专有的一些信息 |
Infimum + Supremum |
最小记录和最大记录 |
26 字节 |
两个虚拟的行记录 |
User Records |
用户记录 | 不确定 | 实际存储的行记录内容 |
Free Space |
空闲空间 | 不确定 | 页中尚未使用的空间 |
Page Directory |
页面目录 | 不确定 | 页中的某些记录的相对位置 |
File Trailer |
文件尾部 | 8 | Schnelles Durchsuchen der DatenseitenstrukturDer durch die Datenseite dargestellte |
InnoDB
-Datenseite grob in 7
-Teile unterteilt. Die Anzahl der von einigen Teilen belegten Bytes wird bestimmt. Ja, die Anzahl der von einigen Teilen belegten Bytes ist ungewiss. Im Folgenden beschreiben wir anhand einer Tabelle grob, welche Inhalte in diesen 7 Teilen gespeichert sind (werfen Sie einen kurzen Blick darauf, wir werden später ausführlicher darauf eingehen): 🎜Name | Chinesischer Name | Leerzeichengröße | Einfache Beschreibung | 🎜|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
名称 | 大小(单位:bit) | 描述 |
---|---|---|
预留位1 |
1 |
没有使用 |
预留位2 |
1 |
没有使用 |
delete_mask |
1 |
标记该记录是否被删除 |
min_rec_mask |
1 |
B+树的每层非叶子节点中的最小记录都会添加该标记 |
n_owned |
4 |
表示当前记录拥有的记录数 |
heap_no |
13 |
表示当前记录在记录堆的位置信息 |
record_type |
3 |
表示当前记录的类型,0 表示普通记录,1 表示B+树非叶节点记录,2 表示最小记录,3 表示最大记录 |
next_record |
16
|
Für eine bessere VerwaltungInnoDB hat viel Mühe in diese Datensätze im Code>Benutzerdatensätze gesteckt. Ist es nicht einfach, die Datensätze einzeln im Abschnitt Benutzerdatensätze gemäß dem angegebenen Zeilenformat zu platzieren? Tatsächlich müssen wir mit den Datensatz-Header-Informationen des Datensatzzeilenformats beginnen. |
page_demo
-Tabelle hat 3 Spalten, davon c1
und c2
werden zum Speichern von Ganzzahlen verwendet, und die Spalte c3
wird zum Speichern von Zeichenfolgen verwendet. Es ist zu beachten, dass wir die Spalte 🎜c1🎜 als Primärschlüssel angeben, sodass InnoDB im spezifischen Zeilenformat nicht die sogenannte 🎜row_id🎜erstellen muss > für uns. Spalte ausgeblendet. Und wir haben den Zeichensatz ascii
und das Zeilenformat Compact
für diese Tabelle angegeben. Das in dieser Tabelle aufgezeichnete Zeilenformatdiagramm sieht also wie folgt aus: 🎜🎜🎜Wie Sie auf dem Bild sehen können, haben wir absichtlich die 5-Byte-Daten von Datensatz-Header-Informationen
eingefügt Es ist markiert, was darauf hinweist, dass es sehr wichtig ist. Sehen wir uns noch einmal die allgemeine Bedeutung jedes Attributs in diesen Datensatz-Header-Informationen
an (wir verwenden derzeit das Zeilenformat Kompakt
). Demonstration): 🎜
Name | Größe (Einheit: Bit) | Beschreibung | 🎜 thead>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Name | Speicherplatzgröße | Beschreibung |
---|---|---|
PAGE_N_DIR_SLOTS PAGE_N_DIR_SLOTS
|
2 字节 |
在页目录中的槽数量 |
PAGE_HEAP_TOP |
2 字节 |
还未使用的空间最小地址,也就是说从该地址之后就是Free Space
|
PAGE_N_HEAP |
2 字节 |
本页中的记录的数量(包括最小和最大记录以及标记为删除的记录) |
PAGE_FREE |
2 字节 |
第一个已经标记为删除的记录地址(各个已删除的记录通过next_record 也会组成一个单链表,这个单链表中的记录可以被重新利用) |
PAGE_GARBAGE |
2 字节 |
已删除记录占用的字节数 |
PAGE_LAST_INSERT |
2 字节 |
最后插入记录的位置 |
PAGE_DIRECTION |
2 字节 |
记录插入的方向 |
PAGE_N_DIRECTION |
2 字节 |
一个方向连续插入的记录数量 |
PAGE_N_RECS |
2 字节 |
该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录) |
PAGE_MAX_TRX_ID |
8 字节 |
修改当前页的最大事务ID,该值仅在二级索引中定义 |
PAGE_LEVEL |
2 字节 |
当前页在B+树中所处的层级 |
PAGE_INDEX_ID |
8 字节 |
索引ID,表示当前页属于哪个索引 |
PAGE_BTR_SEG_LEAF |
10 字节 |
B+树叶子段的头部信息,仅在B+树的Root页定义 |
PAGE_BTR_SEG_TOP |
10 |
Anzahl der Slots im Seitenverzeichnis |
PAGE_HEAP_TOP
🎜🎜2
Bytes🎜🎜Die minimale Adresse des ungenutzten Speicherplatzes, was bedeutet, dass nach dieser Adresse Freier Speicherplatz
🎜 🎜🎜🎜PAGE_N_HEAP
🎜🎜2
Bytes 🎜🎜Die Anzahl der Datensätze auf dieser Seite (einschließlich minimaler und maximaler Datensätze und zum Löschen markierter Datensätze) 🎜🎜🎜🎜PAGE_FREE 🎜🎜2
Bytes🎜🎜Die erste Datensatzadresse, die zum Löschen markiert wurde (jeder gelöschte Datensatz bildet auch einen Datensatz durch next_record
Einfach verknüpfte Liste, Datensätze in dieser einfach verknüpften Liste Liste kann wiederverwendet werden)🎜🎜🎜🎜PAGE_GARBAGE
🎜🎜2
Bytes🎜🎜Die Anzahl der Bytes, die von gelöschten Datensätzen belegt werden🎜🎜 🎜🎜PAGE_LAST_INSERT
🎜🎜2
Bytes🎜🎜Die letzte Position des eingefügten Datensatzes🎜🎜🎜🎜PAGE_DIRECTION
🎜🎜2
Byte 🎜🎜Die Richtung der Datensatzeinfügung 🎜🎜🎜🎜PAGE_N_DIRECTION
🎜🎜2
Byte 🎜🎜Die Anzahl der kontinuierlich in eine Richtung eingefügten Datensätze🎜🎜🎜🎜PAGE_N_RECS
🎜🎜2
Bytes 🎜🎜Anzahl der Datensätze auf der Seite (mit Ausnahme der minimalen und maximalen Datensätze sowie der zum Löschen markierten Datensätze)🎜🎜🎜🎜PAGE_MAX_TRX_ID
🎜🎜8
Bytes 🎜🎜Ändern Sie die maximale Transaktions-ID der aktuellen Seite. Dieser Wert ist nur in sekundären Indizes definiert Seite im B+-Baum🎜🎜🎜🎜PAGE_INDEX_ID
🎜🎜8
Bytes🎜🎜Index-ID, die die aktuelle Seite angibt. Zu welchem Index 🎜🎜🎜🎜PAGE_BTR_SEG_LEAF🎜🎜<code>10
Bytes 🎜🎜Header-Informationen des B+-Baumblattsegments, nur auf der Stammseite des B+-Baums definiert🎜🎜🎜🎜 PAGE_BTR_SEG_TOP
🎜🎜10 Bytes🎜🎜Header-Informationen von Nicht-Blatt-Segmenten des B+-Baums, nur auf der Stammseite des B+-Baums definiert🎜🎜🎜🎜Wenn Sie den vorherigen Artikel sorgfältig gelesen haben, müssen Sie sich über die Bedeutung von PAGE_N_DIR_SLOTS
bis PAGE_LAST_INSERT
und PAGE_N_RECS
im Klaren sein , Es tut mir leid, Sie sollten zurückgehen und den vorherigen Artikel noch einmal lesen. Machen Sie sich keine Sorgen, wenn Sie die restlichen Statusinformationen nicht verstehen. Sie müssen einen Bissen nach dem anderen essen und die Dinge nach und nach lernen (stellen Sie sicher, dass Sie ruhig sind und sich von diesen Substantiven nicht erschrecken lassen). Hier sprechen wir zunächst über die Bedeutung von PAGE_DIRECTION
und PAGE_N_DIRECTION
:
PAGE_N_DIR_SLOTS
到PAGE_LAST_INSERT
以及PAGE_N_RECS
的意思大家一定是清楚的,如果不清楚,对不起,你应该回头再看一遍前边的文章。剩下的状态信息看不明白不要着急,饭要一口一口吃,东西要一点一点学(一定要稍安勿躁哦,不要被这些名词吓到)。在这里我们先唠叨一下PAGE_DIRECTION
和PAGE_N_DIRECTION
的意思:PAGE_DIRECTION
假如新插入的一条记录的主键值比上一条记录的主键值大,我们说这条记录的插入方向是右边,反之则是左边。用来表示最后一条记录插入方向的状态就是PAGE_DIRECTION
。
PAGE_N_DIRECTION
假设连续几次插入新记录的方向都是一致的,InnoDB
会把沿着同一个方向插入记录的条数记下来,这个条数就用PAGE_N_DIRECTION
这个状态表示。当然,如果最后一条记录的插入方向改变了的话,这个状态的值会被清零重新统计。
至于我们没提到的那些属性,我没说是因为现在不需要大家知道。不要着急,当我们学完了后边的内容,你再回头看,一切都是那么清晰。
上边唠叨的Page Header
是专门针对数据页
记录的各种状态信息,比方说页里头有多少个记录了呀,有多少个槽了呀。我们现在描述的File Header
针对各种类型的页都通用,也就是说不同类型的页都会以File Header
作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁啦吧啦吧啦~ 这个部分占用固定的38
个字节,是由下边这些内容组成的:
名称 | 占用空间大小 | 描述 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FIL_PAGE_SPACE_OR_CHKSUM |
4 字节 |
页的校验和(checksum值) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_OFFSET |
4 字节 |
页号 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_PREV |
4 字节 |
上一个页的页号 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_NEXT |
4 字节 |
下一个页的页号 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_LSN |
8 字节 |
页面被最后修改时对应的日志序列位置(英文名是:Log Sequence Number) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_TYPE |
2 字节 |
该页的类型 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_FILE_FLUSH_LSN |
8 字节 |
仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID |
4 PAGE_DIRECTION | Wenn der Primärschlüsselwert eines neu eingefügten Datensatzes größer ist als der Primärschlüsselwert des vorherigen Datensatzes, sagen wir, dass die Einfügerichtung dieses Datensatzes nach rechts verläuft und umgekehrt. Der Status zur Angabe der Einfügerichtung des letzten Datensatzes ist PAGE_N_DIRECTION | Angenommen, dass die Richtungen beim Einfügen neuer Datensätze mehrmals hintereinander konsistent sind, wird
Name | Platz belegt | Beschreibung |
---|
FIL_PAGE_SPACE_OR_CHKSUM
🎜🎜4
Bytes 🎜🎜Prüfsummenwert der Seite🎜 🎜FIL_PAGE_OFFSET
🎜🎜4 code> Bytes 🎜🎜Seitennummer🎜🎜<tr>🎜<code>FIL_PAGE_PREV
🎜🎜4Bytes🎜🎜Die Seitennummer der vorherigen Seite🎜🎜<tr>🎜<code> FIL_PAGE_NEXT
🎜🎜4
Bytes🎜🎜Die Seitennummer der nächsten Seite🎜🎜🎜FIL_PAGE_LSN
🎜🎜8
Bytes 🎜🎜Die entsprechende Protokollsequenzposition, als die Seite zuletzt geändert wurde (englischer Name ist: Protokollsequenznummer)🎜🎜FIL_PAGE_TYPE
🎜🎜2
Bytes🎜🎜Die Typ der Seite🎜🎜FIL_PAGE_FILE_FLUSH_LSN
🎜🎜8
Bytes 🎜🎜 werden nur auf einer Seite des Systemtabellenbereichs definiert, was bedeutet, dass die Datei vorhanden ist mindestens auf den entsprechenden LSN-Wert geleert 🎜🎜FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID
🎜🎜4
Wörter Zu welchem Tabellenbereich gehört der Abschnitt 🎜🎜 Seite 🎜🎜🎜🎜Im Vergleich zu dieser Tabelle schauen wir uns einige derzeit wichtige Teile an:
FIL_PAGE_SPACE_OR_CHKSUM
FIL_PAGE_SPACE_OR_CHKSUM
这个代表当前页面的校验和(checksum)。啥是个校验和?就是对于一个很长很长的字节串来说,我们会通过某种算法来计算一个比较短的值来代表这个很长的字节串,这个比较短的值就称为校验和
。这样在比较两个很长的字节串之前先比较这两个长字节串的校验和,如果校验和都不一样两个长字节串肯定是不同的,所以省去了直接比较两个比较长的字节串的时间损耗。
FIL_PAGE_OFFSET
每一个页
都有一个单独的页号,就跟你的身份证号码一样,InnoDB
通过页号来可以唯一定位一个页
。
FIL_PAGE_TYPE
这个代表当前页
的类型,我们前边说过,InnoDB
为了不同的目的而把页分为不同的类型,我们上边介绍的其实都是存储记录的数据页
,其实还有很多别的类型的页,具体如下表:
类型名称 | 十六进制 | 描述 |
---|---|---|
FIL_PAGE_TYPE_ALLOCATED |
0x0000 | 最新分配,还没使用 |
FIL_PAGE_UNDO_LOG |
0x0002 | Undo日志页 |
FIL_PAGE_INODE |
0x0003 | 段信息节点 |
FIL_PAGE_IBUF_FREE_LIST |
0x0004 | Insert Buffer空闲列表 |
FIL_PAGE_IBUF_BITMAP |
0x0005 | Insert Buffer位图 |
FIL_PAGE_TYPE_SYS |
0x0006 | 系统页 |
FIL_PAGE_TYPE_TRX_SYS |
0x0007 | 事务系统数据 |
FIL_PAGE_TYPE_FSP_HDR |
0x0008 | 表空间头部信息 |
FIL_PAGE_TYPE_XDES |
0x0009 | 扩展描述页 |
FIL_PAGE_TYPE_BLOB |
0x000A | 溢出页 |
FIL_PAGE_INDEX |
0x45BF | 索引页,也就是我们所说的数据页
| Dies stellt die Prüfsumme der aktuellen Seite dar. Was ist eine Prüfsumme? Für eine sehr lange Byte-Zeichenfolge verwenden wir einen Algorithmus, um einen kürzeren Wert zur Darstellung der langen Byte-Zeichenfolge zu berechnen. Dieser kürzere Wert wird als
FIL_PAGE_OFFSET
🎜🎜Jede Seite
hat eine separate Seitennummer, genau wie Ihre ID-Nummer, InnoDB code>A <code> page
kann durch die Seitenzahl eindeutig lokalisiert werden. 🎜
FIL_PAGE_TYPE
🎜🎜Dies stellt den Typ der aktuellen Seite
dar. Wie wir bereits sagten, verwendet InnoDB
ihn für verschiedene Zwecke Die oben vorgestellten Seiten sind eigentlich Datenseiten
, die Datensätze speichern, wie in der folgenden Tabelle aufgeführt: 🎜Typname | Hex | Beschreibung | 🎜
---|---|---|
FIL_PAGE_TYPE_ALLOCATED 🎜 |
0x0000🎜 | Neueste Zuordnung, noch nicht verwendet🎜🎜 |
FIL_PAGE_UNDO_LOG 🎜 |
0x0002🎜 | Protokoll rückgängig machen Seite🎜 🎜 |
FIL_PAGE_INODE 🎜 |
0x0003🎜 | Segmentinformationsknoten🎜🎜 |
FIL_PAGE_IBUF_FREE_LIST 🎜 |
0x0004 🎜Pufferfreie Liste einfügen🎜🎜 | |
FIL_PAGE_IBUF_BITMAP 🎜 |
0x0005🎜 | Pufferbitmap einfügen🎜🎜 |
FIL_PAGE_TYPE_SYS Code >🎜<td>0x0006🎜</td>
<td>Systemseite🎜🎜</td>
<tr>
<td>
<code>FIL_PAGE_TYPE_TRX_SYS 🎜 |
0x0007🎜 | Transaktionssystemdaten🎜🎜 |
FIL_PAGE_TYPE_FSP_HDR🎜 | 0x0008🎜 | Informationen zum Tabellenbereichskopf🎜🎜 |
FIL_PAGE_TYPE_XDES 🎜 |
0x0009🎜 | Erweiterte Beschreibungsseite🎜🎜 |
FIL_PAGE_TYPE_BLOB 🎜 |
0x000A🎜 | Überlaufseite🎜🎜 |
FIL_PAGE_INDEX 🎜 |
0x45BF🎜 | Indexseite, die wir Datenseite nennen🎜🎜🎜🎜Der Typ der Datenseite, auf der wir Datensätze speichern, ist eigentlich
我们前边强调过, 关于 File Trailer我们知道
这个 总结
LSN -Wert zum Zeitpunkt der letzten Änderung der Seite gespeichert Wenn die Prüfsumme und der LSN -Wert des Headers und Trailers nicht erfolgreich überprüft werden, liegt ein Problem mit dem Synchronisierungsprozess vor. Empfohlenes Lernen: 🎜MySQL-Video-Tutorial🎜🎜 |
Das obige ist der detaillierte Inhalt vonEingehende Untersuchung der InnoDB-Datenseite der MySQL-Prinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!