Kontynuuję moje poprzednie pytanie dotyczące prędkości importu w Inno-Tables (niespodzianka!).
Scenariusz
Próbuję zaimportować duży * zrzut bazy danych na mój lokalny komputer programistyczny w rozsądnym czasie. Mamy wiele KEY
załączonych tabel, które okazały się wąskim gardłem, ale nadal są ważne dla naszego systemu na żywo.
Moje podejście po zadaniu powyższego pytania polegało na usunięciu KEY ...
instrukcji ze zrzutów, importowaniu i ponownym dodawaniu kluczy.
Jednak często zdarza mi się edytować bieżący zrzut, aby zaimportować go lokalnie, i natknąłem się na te śmieszne „komentarze” (The disable/enable keys
-lines)
--
-- 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;
Ale w rzeczywistości te „komentarze” są warunkowymi oświadczeniami MySql
To była dla mnie nowość, ale ok, biorąc pod uwagę wynik, mysql --version
że wszystko wygląda dla mnie dobrze:
mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3
Co zakładam
Stół jest zamknięty (w porządku, to tylko ja na urządzeniu deweloperskim). Następnie klucze zdefiniowane w schemacie tabeli są wyłączane, dane są importowane, klucze są włączane.
Dlatego podczas fazy „wstawiania danych” klucze nie powinny tracić czasu, a raczej sprawdzane po wstawieniu wszystkich danych.
Pomyślałbym, że jest to takie samo zachowanie, jak gdybym usunął wszystkie KEY 'foo' (foo)'
linie z zrzutu, zaimportowałem zrzut i uruchomiłem ADD KEY 'foo' ...
później skrypt .
Co obserwuję
Jest znacznie szybsze ręczne usuwanie kluczy, importowanie i ponowne dodawanie kluczy, a następnie poleganie na DISABLE KEYS
instrukcjach warunkowych utworzonych przeze mniemysqldump
Ręczna edycja zrzutu + importu MySQL + dodawanie kluczy = 15 + 8 + 8 ≈ 30min
Zwykły import MySQL: zrezygnowałem, (dostaję zapłatę za 8 godzin dziennie> :))
Nie mogę przestać myśleć, że brakuje mi czegoś bardzo podstawowego (lub trolluje mnie baza danych).
mysqldump --innodb-optimize-keys
z Percona percona.com/doc/percona-server/5.5/management/... długoterminowa zaprzestać używania mysqldump i używać mydumper lub xtrabackup.Odpowiedzi:
Nie można powoływać się na
DISABLE KEYS;
iENABLE KEYS;
dla InnoDB, ponieważ nie jest on zaimplementowany w Storage Engine InnoDB. UruchamianieALTER TABLE ... DISABLE KEYS;
iALTER TABLE ... ENABLE KEYS;
zostały zaprojektowane dla MyISAM. Jak napisano w dokumentacji MySQL dlaALTER TABLE
:Nigdy nie wspomniano o InnoDB w kontekście
ALTER TABLE ... DISABLE/ENABLE KEYS;
Nawet jeśli uruchomisz
ALTER TABLE ... DISABLE KEYS;
tabelę InnoDB, wygeneruje ostrzeżenie:Dlatego nie ma wpływu. Przypomnij sobie, że @jynus wspomniał o tym samym w swojej odpowiedzi w punkcie 7 .
Należy również pamiętać, że MyISAM przechowuje dane i indeksy w dwóch osobnych plikach (.MYD dla danych, .MYI dla indeksów), więc wyłączenie i włączenie indeksów byłoby trywialne. InnoDB zachowuje KLUCZ PODSTAWOWY i dane wiersza na tych samych stronach InnoDB (poprzez Indeks klastrowany). Indeksy wtórne będą nosić KLUCZ PODSTAWOWY jako załącznik do każdego wpisu liścia indeksu wtórnego . Ponieważ dane i indeksy są powiązane przez Indeks klastrowany, nikt jak dotąd nie próbował wdrożyć
DISABLE KEYS
aniENABLE KEYS
w InnoDB.źródło