MySQL
Ein sehr wichtiges Merkmal, das die Datenbank von anderen Datenbanken unterscheidet, ist ihre Plug-in-Tabellenspeicher-Engine, die auf Tabellen und nicht auf Datenbanken basiert. Da jede Speicher-Engine ihre eigenen Eigenschaften hat, können wir für jede Tabelle die am besten geeignete Speicher-Engine auswählen.
Als DBA
sollten wir ein tiefes Verständnis von Speicher-Engines haben. Heute stellen wir die beiden gängigsten Speicher-Engines und ihre Unterschiede vor: InnoDB
und MyISAM
.
InnoDB
Speicher-Engine
InnoDB
Speicher-Engine unterstützt Transaktionen und ihr Designziel ist hauptsächlich für OLTP(On Line Transaction Processing 在线事务处理)
Anwendungen. Zu den Funktionen gehören das Zeilensperrdesign, die Unterstützung für Fremdschlüssel und die Unterstützung für nicht sperrende Lesevorgänge. Ab der 5.5.8
-Version wird InnoDB
zur Standardspeicher-Engine von MySQL
.
InnoDB
Die Speicher-Engine verwendet einen Clustered-Index zum Speichern von Daten, sodass jede Tabelle in der Reihenfolge des Primärschlüssels gespeichert wird. Wenn der Primärschlüssel nicht angegeben ist, wird InnoDB
automatisch für jede Tabelle generiert Zeile A 6
von Bytes dient als Primärschlüssel. ROWID
Speicher-EngineMyISAM
Die Speicher-Engine unterstützt kein Transaktions- und Tabellensperrdesign, unterstützt jedoch den Volltextindex , hauptsächlich für MyISAM
Anwendung, geeignet für Szenarien mit häufigen Abfragen wie Data Warehouses. Vor der OLAP(On Line Analytical Processing 联机分析处理)
-Version war 5.5.8
die Standardspeicher-Engine für MyISAM
. Diese Engine stellt die Notwendigkeit dar, riesige Datenmengen abzufragen und zu analysieren. Der Schwerpunkt liegt auf der Leistung, sodass Abfragen schneller ausgeführt werden als MySQL
. InnoDB
Der Unterschied zwischen und InnoDB
MyISAM
Transaktionen
Für Datenbankoperationen Atomarität, wir brauchen Transaktionen. Stellen Sie sicher, dass eine Reihe von Vorgängen entweder alle erfolgreich sind oder fehlschlagen, beispielsweise die Funktion des Geldtransfers. Normalerweise platzieren wir mehrere-Anweisungen zwischen SQL
und begin
, um eine Transaktion zu bilden. commit
wird unterstützt, InnoDB
wird nicht unterstützt. MyISAM
Primärschlüssel
Aufgrund des Clustered-Index von wird der Primärschlüssel automatisch generiert, wenn der Primärschlüssel nicht angegeben wird. InnoDB
Unterstützt die Tabellenexistenz ohne Primärschlüssel. MyISAM
Fremdschlüssel
Um die Abhängigkeiten komplexer Logik zu lösen, benötigen wir Fremdschlüssel. Beispielsweise muss der Eintrag der Ergebnisse der Hochschulaufnahmeprüfung einem bestimmten Studenten gehören, daher benötigen wir einen Fremdschlüssel für die Datenbank der Hochschulaufnahmeprüfungsergebnisse mit der Zulassungskartennummer. wird unterstützt, InnoDB
wird nicht unterstützt. MyISAM
Index
Um die Geschwindigkeit von Abfragen sowie Sortier- und Übereinstimmungssuchen zu optimieren, benötigen wir Indizes. Beispielsweise werden die Namen aller Personen der Reihe nach ab dem ersten Buchstaben von gespeichert. Wenn wir nach a-z
oder der Position zhangsan
suchen, können wir schnell den Ort finden, nach dem wir suchen möchten. 44
ist ein Clustered-Index. Die Daten sind an den Clustered-Index des Primärschlüssels gebunden. Wenn Sie den Hilfsindex anderer Spalten durchsuchen, müssen Sie zuerst den Clustered-Index finden und dann alle Daten abfragen, was zwei Abfragen erfordert. InnoDB
ist ein nicht gruppierter Index, die Datendateien sind getrennt und der Index speichert den Zeiger der Daten. MyISAM
-Version und InnoDB 1.2.x
-Version danach unterstützen beide die Volltextindizierung. MySQL5.6
Automatische Inkrementierungauto_increment
, dass die Spalte ein Index und die erste Spalte des Index sein muss . Andernfalls wird ein Fehler gemeldet: InnoDB
mysql> create table test( -> a int auto_increment, -> b int, -> key(b,a) -> ) engine=InnoDB; ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a keyErsetzen Sie einfach die
-Sequenz durch (b,a)
. (a,b)
kann dieses Feld mit anderen Feldern in beliebiger Reihenfolge kombinieren, um einen gemeinsamen Index zu bilden. MyISAM
Anzahl der Tabellenzeilen
Eine sehr häufige Anforderung besteht darin, zu sehen, wie viele Daten sich in der Tabelle befinden. In diesem Fall benötigen wir. select count(*) from table_name
Die Anzahl der Tabellenzeilen wird nicht gespeichert und ein vollständiger Tabellenscan ist erforderlich. InnoDB
Speichern Sie es in einer Variablen und lesen Sie den Wert direkt, was schneller ist. Damals waren die beiden bei der Abfrage mit MyISAM
gleich. where
Speicherung
Datenbankdateien müssen auf der Festplatte gespeichert und dann in den Speicher eingelesen werden, wenn die Anwendung sie benötigt. Umfasst im Allgemeinen Datendateien und Indexdateien. ist unterteilt in: InnoDB
.frm
.ibdata1
.ibd
.redo
ist in drei Dateien unterteilt: MyISAM
.frm
.MYD
.MYI
Ausführungsgeschwindigkeit
Wenn es sich bei Ihrem Vorgang um eine große Anzahl von Abfragevorgängen handelt, z. B. SELECT
, bietet die Verwendung von MyISAM
eine bessere Leistung.
Wenn es sich bei den meisten Vorgängen um Löschungen und Änderungen handelt, verwenden Sie InnoDB
. Die Indizes von
InnoDB
und MyISAM
sind beide B+
-Baumindizes. Der Primärschlüssel der Daten kann über den Index abgefragt werden Erläutern Sie die Indexprinzipien und -algorithmen von MySQL InnoDB. Der Leistungsunterschied zwischen den beiden liegt hauptsächlich in den unterschiedlichen Verarbeitungsmethoden nach der Abfrage des Primärschlüssels der Daten. B+
speichert Index- und Datendateien im Cache. Im Allgemeinen wird InnoDB
als kleinste Einheit (Datenseitengröße) verwendet, um mit der Festplatte zu interagieren. 16KB
erhält tatsächlich den Primärschlüssel Daten. InnoDB
, es muss alle Daten der Zeile in der Datenseite im Speicher finden, aber wenn es sich bei den Daten nicht um heiße Daten handelt, muss es auch die Datenseite durchsuchen und ersetzen, was mehrere Male erforderlich sein kann ID
Betrieb und In-Memory-Datensuche, was zu einem hohen Zeitaufwand führt. I/O
-Speicher-Engine speichert nur Indexdateien und keine Datendateien. Der Cache seiner Datendateien verwendet direkt den Cache des Betriebssystems, was sehr einzigartig ist. Zu diesem Zeitpunkt kann derselbe Speicherplatz mehr Indizes laden. Wenn also der Cache-Speicherplatz begrenzt ist, wird die Indexdatenseite von MyISAM
seltener ersetzt. Nach dem, was wir zuvor wissen, sind die Dateien von MyISAM
in MyISAM
und MYI
unterteilt. Wenn wir den Primärschlüssel MYD
bis MYI
finden, erhalten wir tatsächlich den ID
-Offset von MYD
Datendatei finden ist viel schneller als die adressierte Zuordnung. offset
InnoDB
Aber da
Zeilensperren unterstützt, ist die Parallelitätsleistung von MyISAM
bei einer großen Anzahl von Schreibvorgängen viel besser als InnoDB
. Gleichzeitig verbessert InnoDB
auch die Leistung beim gleichzeitigen Lesen und Schreiben durch MyISAM
Multiversionskontrolle. InnoDB
MVVC
Daten löschendelete
Beim Aufruf von
die Tabelle direkt neu und delete from table
löscht Zeile für Zeile, aber Sie kann stattdessen MyISAM
verwenden. Referenz: Zwei Möglichkeiten und Unterschiede beim Löschen von Tabellendaten in MySQL. InnoDB
truncate table
Unterstützt nur Tabellensperren und die gesamte Tabelle wird für jeden Vorgang gesperrt.
MyISAM
Unterstützt das Sperren von Zeilen und sperrt eine Mindestanzahl von Datenzeilen für jeden Vorgang. InnoDB
Tabellensperren verbrauchen weniger Ressourcen als Zeilensperren und verursachen keinen Deadlock, aber gleichzeitig ist die Parallelitätsleistung schlecht. Die Zeilensperre verbraucht mehr Ressourcen, ist langsamer und kann einen Deadlock verursachen. Da jedoch die Sperrgranularität gering und die Datenmenge klein ist, ist die Parallelitätsleistung gut. Wenn eine Anweisung von
InnoDB
Wenn ein Zeilensperr-Deadlock auftritt, wird die Anzahl der von jeder Transaktion betroffenen Zeilen berechnet und dann wird die Transaktion mit einer geringeren Anzahl von Zeilen zurückgesetzt.
Nach einem Absturz gibt es keine schnelle und sichere Wiederherstellung.
Es gibt einen vollständigen Wiederherstellungsmechanismus. MyISAM
InnoDB
Zwischenspeichert nur Indexdaten und fragt Daten über den Index ab.
Zwischenspeichert nicht nur Indexdaten, sondern auch Dateninformationen, liest die Daten seitenweise in den Cache-Pool und aktualisiert sie gemäß dem MyISAM
-Algorithmus. InnoDB
LRU(Latest Rare Use 最近最少使用)
So wählen Sie eine Speicher-Engine ausDie Anweisungen zum Erstellen einer Tabelle sind dieselben, nur das letzte
gibt die Speicher-Engine an .type
MyISAM
1. Eine große Anzahl von Abfragen
count
2. Häufige Abfragen, seltene Einfügungen
3, Kein Transaktionsvorgang
InnoDB
1. Hohe Verfügbarkeit ist erforderlich oder Transaktionen sind erforderlich
2. Tabelle wird häufig aktualisiert
Empfohlenes Lernen:
MySQL-TutorialDas obige ist der detaillierte Inhalt vonUnterschiede zwischen InnoDB- und MyISAM-Speicher-Engines in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!