Ich habe eine Antwort auf meine vorherige Frage zur Importgeschwindigkeit mit Inno-Tables (Überraschung!).
Szenario
Ich versuche, in angemessener Zeit einen großen * Datenbank-Dump auf meinen lokalen Entwicklungscomputer zu importieren. Wir haben viele KEY
s an den Tabellen angebracht, die sich als Engpass herausgestellt haben, aber für unser Live-System immer noch wichtig sind.
Nachdem ich oben eine Frage gestellt hatte, bestand mein Ansatz darin, KEY ...
Anweisungen aus den Dump-, Import- und Re-Add-Schlüsseln zu löschen .
Allerdings bearbeite ich häufig einen aktuellen Speicherauszug, um ihn lokal zu importieren, und bin auf diese lustigen "Kommentare" (The disable/enable keys
-lines) gestoßen.
--
-- Dumping data for table `monster`
--
LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT … INSERT … INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;
Tatsächlich handelt es sich bei diesen "Kommentaren" jedoch um bedingte MySql-Anweisungen
Das war eine Neuigkeit für mich, aber ok, angesichts des Ausgabeformulars mysql --version
sieht alles für mich gut aus:
mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3
Was ich annehme
Der Tisch ist gesperrt (gut, ich bin nur auf der Dev Mashine). Dann werden die im Tabellenschema definierten Schlüssel deaktiviert, Daten importiert und Schlüssel aktiviert.
Während der "Dateneinfügungs" -Phase sollte also keine Zeit mit Schlüsseln verschwendet werden, sondern nach dem Einfügen aller Daten überprüft werden.
Ich würde denken, dass dies das gleiche Verhalten ist, als würde ich alle KEY 'foo' (foo)'
Zeilen aus dem Dump löschen, den Dump importieren und anschließend ein Skript mit ausführen ADD KEY 'foo' ...
.
Was ich beobachte
Es ist viel schneller, die Schlüssel manuell zu löschen, Schlüssel zu importieren und erneut hinzuzufügen, als sich auf bedingte DISABLE KEYS
Anweisungen zu verlassen, die meine erstellt habenmysqldump
Manuelle Bearbeitung von Dump + MySQL-Import + Hinzufügen von Schlüsseln = 15 + 8 + 8 ≈ 30min
Einfacher MySQL-Import: aufgegeben (ich werde nur für 8 Stunden / Tag bezahlt> :))
Ich kann nicht anders, als zu denken, dass mir hier etwas sehr Grundlegendes fehlt (oder die Datenbank mich trollt).
mysqldump --innodb-optimize-keys
von Percona percona.com/doc/percona-server/5.5/management/… Langfristig: Verwenden Sie mysqldump nicht mehr und verwenden Sie mydumper oder xtrabackup.Antworten:
Sie können sich nicht auf
DISABLE KEYS;
undENABLE KEYS;
für InnoDB verlassen, da es nicht in der InnoDB Storage Engine implementiert ist. LaufenALTER TABLE ... DISABLE KEYS;
undALTER TABLE ... ENABLE KEYS;
wurden für MyISAM entwickelt. Wie es in der MySQL-Dokumentation heißt fürALTER TABLE
:InnoDB wird im Zusammenhang mit nie erwähnt
ALTER TABLE ... DISABLE/ENABLE KEYS;
Selbst wenn Sie
ALTER TABLE ... DISABLE KEYS;
gegen eine InnoDB-Tabelle laufen , wird eine Warnung generiert:Deshalb gibt es keine Auswirkungen. Bitte denken Sie daran, dass @jynus dasselbe in seiner Antwort in Punkt 7 erwähnt hat .
Beachten Sie auch, dass MyISAM Daten und Indizes in zwei separaten Dateien speichert (.MYD für Daten, .MYI für Indizes). Daher wäre es trivial, Indizes zu deaktivieren und zu aktivieren. InnoDB speichert den PRIMARY KEY und die Zeilendaten auf denselben InnoDB-Seiten (über den Clustered Index). Sekundärindizes tragen den PRIMÄREN SCHLÜSSEL als Anhang zu jedem sekundären Indexblatteintrag . Da die Daten und Indizes über den Clustered Index miteinander verflochten sind, hat niemand, als der noch versucht , zu implementieren
DISABLE KEYS
undENABLE KEYS
in InnoDB.quelle