Konwersja dużego stołu z MyISAM na Innodb

10

Mam tabelę z około 300 milionami wierszy w formacie MyISAM, którą chcę przekonwertować na Innodb

Moim pierwotnym celem było ograniczenie użycia poprzez zmianę schematu tabeli w celu uzyskania prostszych indeksów. Zrzuciłem cały stół, upuściłem go, odtworzyłem z mniejszą liczbą indeksów i teraz ponownie importuję. Jednak zapomniałem podać, że powinien to być innodb zamiast myisam.

Czy mogę po prostu zrobić standardowy ALTER TABLE ... ENGINE = INNODB? Czy jest coś wyjątkowego, o czym powinienem wiedzieć przy tak ogromnym stole?

Operacja importu danych trwa około 12 godzin - nie chcę tego robić ponownie. Dlatego właśnie chcę to przekonwertować.

Will Glass
źródło
Dzięki rzędom o długości 300 mln MyISAM i tak jest prawdopodobnie szybszy i lepiej pasuje do tabeli tego rozmiaru!
Mark Henderson

Odpowiedzi:

14

Poniższe ćwiczenie pochodzi z książki „ High Performance MySQL, Second Edition ”.

To doskonała książka i polecam ją każdemu.

Krótka odpowiedź brzmi:

Biorąc pod uwagę rozmiar i warunki stołu, bez względu na wybraną metodę, myślę, że potencjalnie czeka Cię długie oczekiwanie.


Tabela konwersji

Istnieje kilka sposobów konwersji tabeli z jednego silnika pamięci na inny, każdy z zaletami i wadami.

ZMIEŃ TABELĘ

mysql> ALTER TABLE mytable ENGINE = Falcon;

Ta składnia działa dla wszystkich silników pamięci masowej, ale jest pewien haczyk: może to zająć dużo czasu. MySQL wykona kopię starej tabeli wiersz po wierszu do nowej tabeli. W tym czasie prawdopodobnie wykorzystasz całą pojemność dyskową we / wy serwera, a oryginalna tabela zostanie zablokowana podczas odczytu.

Zrzut i import

Aby uzyskać większą kontrolę nad procesem konwersji, możesz najpierw zrzucić tabelę do pliku tekstowego za pomocą narzędzia mysqldump. Po zrzuceniu tabeli możesz po prostu edytować plik zrzutu, aby dostosować zawartą w nim instrukcję CREATE TABLE. Pamiętaj, aby zmienić nazwę tabeli oraz jej typ, ponieważ nie możesz mieć dwóch tabel o tej samej nazwie w tej samej bazie danych, nawet jeśli są one różnych typów - a mysqldump domyślnie zapisuje komendę DROP TABLE przed CREATE TABLE , więc możesz stracić swoje dane, jeśli nie będziesz ostrożny!

UTWÓRZ i WYBIERZ

Trzecia technika konwersji to kompromis między prędkością pierwszego mechanizmu a bezpieczeństwem drugiego. Zamiast zrzucić całą tabelę lub przekonwertować ją na raz, utwórz nową tabelę i użyj składni INSERT ... SELECT MySQL, aby wypełnić ją w następujący sposób:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Działa to dobrze, jeśli nie masz dużo danych, ale jeśli tak, to często bardziej wydajne jest wypełnianie tabeli przyrostowo, zatwierdzanie transakcji między poszczególnymi porcjami, aby dzienniki cofania nie rosły. Zakładając, że id jest kluczem podstawowym, uruchom tę kwerendę wielokrotnie (używając każdorazowo większych wartości xiy), aż skopiujesz wszystkie dane do nowej tabeli:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Po wykonaniu tej czynności pozostanie oryginalny stół, który możesz upuścić, gdy skończysz, i nowy stół, który jest teraz w pełni wypełniony. Zachowaj ostrożność, aby zablokować oryginalną tabelę, jeśli to konieczne, aby uniknąć niespójnej kopii danych!

KPWINC
źródło
2

Instrukcja ALTER TABLE zasadniczo robi to samo: serwer tworzy tymczasową tabelę, w której kopiuje wszystkie wiersze, a następnie wykonuje RENAME. Formaty na dysku są bardzo różne w InnoDB i MyISAM, więc nie oczekuję, że znajdziesz skrót do tego.

Inna uwaga (o której być może wiesz, ale pomogłaby to innym czytającym to): format dysku na InnoDB jest wysoce zależny od klucza podstawowego, ponieważ gromadzi na nim rekordy. Dlatego podczas pracy z dużymi tabelami InnoDB zastanów się dwa razy, zanim wybierzesz klucz podstawowy, ponieważ jego zmiana powoduje przebudowanie całego stołu, podobnie jak problem.

Tak czy inaczej, najpierw zalecam wykonanie kilku testów na stole o średnim rozmiarze, a następnie ich wykonanie.

rpetre
źródło
2
Każda operacja zmiany tabeli w MySQL (i obejmująca dodawanie indeksów) powoduje przebudowanie tabeli.
David Pashley,