Heim  >  Artikel  >  Datenbank  >  Unterschiede zwischen InnoDB- und MyISAM-Speicher-Engines in MySQL

Unterschiede zwischen InnoDB- und MyISAM-Speicher-Engines in MySQL

青灯夜游
青灯夜游nach vorne
2019-11-23 17:07:022176Durchsuche

MySQLEin 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.

Unterschiede zwischen InnoDB- und MyISAM-Speicher-Engines in MySQL

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.

InnoDBDie 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 MyISAMAnwendung, 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 InnoDBMyISAM

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

Ab der

-Version und InnoDB 1.2.x-Version danach unterstützen beide die Volltextindizierung. MySQL5.6

Automatische Inkrementierungauto_increment

Für Felder mit automatischer Inkrementierung erfordert

, 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 key
Ersetzen Sie einfach die

-Sequenz durch (b,a). (a,b)

Und

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. InnoDBSpeichern 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

  • Tabellenstrukturdatei.frm
  • Gemeinsamer Tabellenbereich.ibdata1
  • Tabelle exklusiv Der Speicherplatz .ibd
  • Protokolldatei.redo

ist in drei Dateien unterteilt: MyISAM

  • Speichertabellendefinition.frm
  • Speichertabellendaten.MYD
  • Speichertabellenindex.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 IDBetrieb und In-Memory-Datensuche, was zu einem hohen Zeitaufwand führt. I/O

Die

-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. offsetInnoDBAber da

eine Tabellensperre ist und

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. InnoDBMVVC

Daten löschendeleteBeim Aufruf von

erstellt

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. InnoDBtruncate table

Sperren

Unterstützt nur Tabellensperren und die gesamte Tabelle wird für jeden Vorgang gesperrt.

MyISAMUnterstützt das Sperren von Zeilen und sperrt eine Mindestanzahl von Datenzeilen für jeden Vorgang.
InnoDBTabellensperren 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

den zu scannenden Bereich nicht bestimmen kann, wird auch die gesamte Tabelle gesperrt.

InnoDBWenn 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.

Datenwiederherstellung

Nach einem Absturz gibt es keine schnelle und sichere Wiederherstellung.

Es gibt einen vollständigen Wiederherstellungsmechanismus. MyISAMInnoDB

Daten-Caching

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. InnoDBLRU(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

MyISAM1. Eine große Anzahl von Abfragen

count2. 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-Tutorial

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen