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ć.
Odpowiedzi:
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Ę
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:
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:
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!
źródło
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.
źródło