In diesem Artikel erfahren Sie, wie Sie Indizes in der MySQL-Speicher-Engine implementieren. Ich hoffe, dass er Ihnen weiterhilft!
Wir wissen, dass verschiedene Speicher-Engine-Dateien unterschiedlich sind. Wir können das Datendateiverzeichnis überprüfen:
show VARIABLES LIKE 'datadir';
Jede InnoDB-Tabelle hat zwei Dateien (.frm und .ibd) und die MyISAM-Tabelle hat drei Dateien (.frm). , .MYD, .MYI) . [Verwandte Empfehlung: MySQL-Video-Tutorial]
Es gibt eine identische Datei, .frm
. .frm
ist eine Datei, die die Tabellenstruktur in MySQL definiert. Sie wird unabhängig davon generiert, welche Speicher-Engine Sie beim Erstellen der Tabelle auswählen. Daher werden wir sie nicht näher betrachten. .frm
。 .frm
是 MySQL 里面表结构定义的文件,不管你建表的时候选用任何一个存储引擎都会生成,我们就不看了。
我们主要看一下其他两个文件是怎么实现 MySQL 不同的存储引擎的索引的。
我们先来看下 MyISAM。
在 MyISAM 里面,另外有两个文件:
一个是.MYD
文件,D 代表 Data,是 MyISAM 的数据文件,存放数据记录,比如我们的 user_myisam 表的所有的表数据。
一个是.MYI
文件,I 代表 Index,是 MyISAM 的索引文件,存放索引,比如我们在 id 字段上面创建了一个主键索引,那么主键索引就是在这个索引文件里面。
也就是说,在 MyISAM 里面,索引和数据是两个独立的文件。那我们怎么根据索引找到数据呢?
MyISAM 的 B+Tree 里面,叶子节点存储的是数据文件对应的磁盘地址。所以从索引文件.MYI
中找到键值后,会到数据文件.MYD
中获取相应的数据记录。
这里画的是主键索引,如果是辅助索引,有什么不一样呢?
在 MyISAM 里面,辅助索引也在这个.MYI
文件里面。 辅助索引跟主键索引存储和检索数据的方式是没有任何区别的,一样是在索引文件里面找到磁盘地址,然后到数据文件里面获取数据。
InnoDB 只有一个文件(.ibd 文件),那索引放在哪里呢?
在 InnoDB 里面,它是以主键为索引来组织数据的存储的,所以索引文件和数据文件是同一个文件,都在.ibd
Eine ist dieIn MyISAM gibt es zwei weitere Dateien:
.MYD
-Datei, D steht für Data, also MyISAM-Datendateien speichern Datensätze, wie zum Beispiel alle Tabellendaten in unserer Tabelle user_myisam. .MYI
, die die Indexdatei von MyISAM ist. Wenn wir beispielsweise einen Primärschlüsselindex für das ID-Feld erstellen Der Primärschlüsselindex befindet sich in dieser Indexdatei. Mit anderen Worten, in MyISAM sind Index und Daten zwei unabhängige Dateien. Wie finden wir also die Daten basierend auf dem Index?Im B+Tree von MyISAM speichern die Blattknoten die Festplattenadressen, die den Datendateien entsprechen. Daher wird nach dem Finden des Schlüsselwerts aus der Indexdatei
.MYI
der entsprechende Datensatz aus der Datendatei .MYD
abgerufen. Was hier angezeigt wird, ist der Primärschlüsselindex. Wenn es sich um einen Hilfsindex handelt, was ist der Unterschied? In MyISAM befindet sich der Hilfsindex auch in dieser .MYI
-Datei. Es gibt keinen Unterschied zwischen dem Hilfsindex und dem Primärschlüsselindex in der Art und Weise, wie sie Daten speichern und abrufen. Sie finden auch die Festplattenadresse in der Indexdatei und erhalten dann die Daten in der Datendatei.
InnoDB hat nur eine Datei (.ibd-Datei), wo ist also der Index? In InnoDB wird der Primärschlüssel als Index zum Organisieren der Datenspeicherung verwendet, sodass die Indexdatei und die Datendatei dieselbe Datei sind, beide in der DateiInnoDB
.ibd
. Auf dem Blattknoten des Primärschlüsselindex von InnoDB werden unsere Daten direkt gespeichert. bedeutet, dass die logische Reihenfolge der Indexschlüsselwerte mit der physischen Speicherreihenfolge der Tabellendatenzeilen übereinstimmt. (Zum Beispiel ist das Wörterbuchverzeichnis nach Pinyin sortiert, und der Inhalt ist auch nach Pinyin sortiert. Dieses nach Pinyin sortierte Verzeichnis wird als Clustered-Index bezeichnet.)
🎜In InnoDB wird die Art und Weise, wie Daten organisiert werden, als Clustered-Index-Organisationstabelle bezeichnet. Der Primärschlüsselindex ist also ein Clustered-Index und Nicht-Primärschlüssel sind Nicht-Clustered-Indizes. 🎜🎜🎜Wie speichern und rufen andere Indizes als Primärschlüssel, wie zum Beispiel der gewöhnliche Index, den wir auf dem Namensfeld aufbauen, Daten ab? 🎜🎜🎜🎜🎜🎜In InnoDB gibt es eine primäre und sekundäre Unterscheidung zwischen Primärschlüsselindex und Hilfsindex. 🎜🎜Der Hilfsindex speichert den Hilfsindex und die Primärschlüsselwerte. Wenn Sie zum Abfragen einen Hilfsindex verwenden, wird der Primärschlüsselindex basierend auf dem Primärschlüsselwert abgefragt und die Daten werden schließlich abgerufen. 🎜🎜Wenn wir beispielsweise den Namensindex verwenden, um name = '青山' abzufragen, wird der Primärschlüsselwert im Blattknoten gefunden, d. h. id = 1, und dann zum Blattknoten des Primärschlüsselindex gewechselt um die Daten zu bekommen. 🎜🎜🎜Noch eine Frage: Was ist, wenn eine Tabelle keinen Primärschlüssel hat? 🎜🎜🎜1. Wenn wir einen Primärschlüssel (PRIMARY KEY) definieren, wählt InnoDB den Primärschlüssel als Clustered-Index aus. 🎜🎜2. Wenn der Primärschlüssel nicht explizit definiert ist, wählt InnoDB den ersten eindeutigen Index, der keinen NULL-Wert enthält, als Primärschlüsselindex aus. 🎜🎜3. Wenn kein solcher eindeutiger Index vorhanden ist, wählt InnoDB die integrierte 6 Byte lange ROWID als versteckten Clusterindex, der den Primärschlüssel beim Schreiben von Zeilendatensätzen erhöht. 🎜select _rowid name from t2;
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonEine kurze Analyse der Indizes in der MySQL-Speicher-Engine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!