Die DISABLE KEYS von MySqlDump haben keine Auswirkungen auf den Import

10

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 KEYs 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 --versionsieht 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 KEYSAnweisungen 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).

nuala
quelle
2
Kurzfristig: Verwendung mysqldump --innodb-optimize-keysvon Percona percona.com/doc/percona-server/5.5/management/… Langfristig: Verwenden Sie mysqldump nicht mehr und verwenden Sie mydumper oder xtrabackup.
Jynus

Antworten:

12

Sie können sich nicht auf DISABLE KEYS;und ENABLE KEYS;für InnoDB verlassen, da es nicht in der InnoDB Storage Engine implementiert ist. Laufen ALTER TABLE ... DISABLE KEYS;und ALTER TABLE ... ENABLE KEYS;wurden für MyISAM entwickelt. Wie es in der MySQL-Dokumentation heißt fürALTER TABLE :

Wenn Sie ALTER TABLE für eine MyISAM-Tabelle verwenden, werden alle nicht eindeutigen Indizes in einem separaten Stapel erstellt (wie bei REPAIR TABLE). Dies sollte ALTER TABLE viel schneller machen, wenn Sie viele Indizes haben.

Bei MyISAM-Tabellen kann die Schlüsselaktualisierung explizit gesteuert werden. Verwenden Sie ALTER TABLE ... DISABLE KEYS, um MySQL anzuweisen, die Aktualisierung nicht eindeutiger Indizes zu beenden. Verwenden Sie dann ALTER TABLE ... ENABLE KEYS, um fehlende Indizes neu zu erstellen. MyISAM führt dies mit einem speziellen Algorithmus durch, der viel schneller ist als das Einfügen von Schlüsseln nacheinander. Das Deaktivieren von Schlüsseln vor dem Ausführen von Masseneinfügevorgängen sollte daher eine erhebliche Beschleunigung bewirken. Für die Verwendung von ALTER TABLE ... DISABLE KEYS ist zusätzlich zu den zuvor genannten Berechtigungen das INDEX-Privileg erforderlich.

Während die nicht eindeutigen Indizes deaktiviert sind, werden sie für Anweisungen wie SELECT und EXPLAIN ignoriert, die sie sonst verwenden würden.

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:

mysql> show create table mytimes\G
*************************** 1. row ***************************
       Table: mytimes
Create Table: CREATE TABLE `mytimes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `totalTime` int(11) NOT NULL,
  `totalTimeDesc` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> alter table mytimes disable keys;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytimes' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

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 KEYSund ENABLE KEYSin InnoDB.

RolandoMySQLDBA
quelle
1
"Ich habe es dir gesagt" :-)
Jynus
@jynus HA HA :-). Sie sollten Ihren mysqldump-Kommentar für InnoDB ( dba.stackexchange.com/questions/76565/… ) als Antwort veröffentlichen.
RolandoMySQLDBA
@yoshi Ich schreibe einen Artikel basierend auf Ihrer ursprünglichen Frage, bleiben Sie dran.
Jynus
@yosi Wie versprochen: dbahire.com/…
jynus
@RolandoMySQLDBA, Wenn InnoDB keine Schlüssel aktivieren / deaktivieren kann, sollte es nicht einen Fehler anstelle einer bloßen Warnung geben?
Pacerier