Co oznacza „Tabela nie obsługuje optymalizacji, zamiast tego należy odtworzyć i przeanalizować”?

99

Pracuję nad MySQL 5.5 i próbuję odbudować indeks za pomocą OPTIMIZE TABLEzapytania. Otrzymuję następujący błąd:

Tabela nie obsługuje optymalizacji, zamiast tego wykonuje odtwarzanie i analizę

Co to znaczy? Czy silnik MySQL nie pozwala na odbudowę indeksu? Co dzieje się za tą wiadomością na poziomie silnika MySQL 5.5?

Vikrant More
źródło

Odpowiedzi:

192

To naprawdę wiadomość informacyjna.

Prawdopodobnie wykonujesz OPTYMALIZACJĘ na tabeli InnoDB (tabela przy użyciu silnika pamięci InnoDB, a nie silnika pamięci MyISAM ).

InnoDB nie obsługuje OPTYMALIZACJI tak jak MyISAM. Robi coś innego. Tworzy pustą tabelę i kopiuje do niej wszystkie wiersze z istniejącej tabeli i zasadniczo usuwa starą tabelę i zmienia nazwę nowej tabeli, a następnie uruchamia ANALIZĘ w celu zebrania statystyk. To najbliższe osiągnięcie przez InnoDB OPTYMALIZACJI.

Wiadomość, którą otrzymujesz, to w zasadzie serwer MySQL powtarzający to, co silnik pamięci masowej InnoDB powiedział serwerowi MySQL:

Tabela nie obsługuje optymalizacji , mówi silnik magazynu InnoDB ...

„Ja (silnik pamięci masowej InnoDB) nie wykonuję operacji OPTYMALIZACJI, tak jak robi to mój przyjaciel (silnik pamięci masowej MyISAM)”.

„zamiast tego wykonuję ponowne tworzenie i analizowanie”, tak mówi silnik magazynu InnoDB ...

„Zdecydowałem się wykonać inny zestaw operacji, które dadzą równoważny wynik”.

spencer7593
źródło
14
ok, czy mógłbyś podzielić się innym sposobem, w jaki robisz.
Vikrant More
Jestem pewien, że jest to gdzieś w Podręczniku MySQL; jest to oczekiwane zachowanie i nie ma się czym martwić. (Z wyjątkiem tego, że tabela będzie „zablokowana” i niedostępna, gdy proces się zakończy, co może chwilę potrwać w przypadku tabeli HUGH JASS). Odniesienie: https://dev.mysql.com/doc/refman/5.5/ pl / optimize-table.html Zobacz sekcję „Szczegóły InnoDB”.
spencer7593
Możesz także użyć MySQL Workbench do wykonania optymalizacji tabeli. Zobacz dokumentację Schema and Table Inspector, aby uzyskać dodatkowe informacje. Zwróć uwagę na opcję „Optymalizuj tabelę”.
Philip Olson
1
Doskonałe wytłumaczenie dla osób inicjujących w świecie db. Dziękuję bardzo
tachomi
5
Uwaga - nie używaj tego, jeśli brakuje miejsca na dysku, ponieważ może to spowodować wyczerpanie serwera podczas próby odtworzenia bardzo dużej tabeli.
Danny Staple
22

OPTIMIZE TABLEdziała dobrze z silnikiem InnoDB zgodnie z oficjalnym artykułem pomocy: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Zauważysz, że optymalizacja tabel InnoDB odbuduje strukturę tabeli i zaktualizuje statystyki indeksu (coś podobnego ALTER TABLE).

Pamiętaj, że ta wiadomość może być tylko informacją, a bardzo ważną informacją jest stan Twojego zapytania: po prostu OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
sdesvergez
źródło
2
Niezupełnie, MySQL poda przyczynę niepowodzenia: tymczasowy błąd zapisu pliku, operacja nie powiodła się.
iwind
8

Najlepszą opcją jest utworzenie nowej tabeli o takich samych właściwościach

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Zmień nazwy NEW.NAME.TABLE i TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Po zakończeniu pracy usuń

DROP TABLE <TABLE.CRASHED.BACKUP>;
tquang
źródło
2
Czy ta metoda zachowuje indeksy i wyzwalacze?
Joel Murphy
1
Tak oczywiście. Wszyscy! Możesz spróbować, a następnie użyć phpMyAdmina do ponownego sprawdzenia
tquang
2
To nie powoduje odtworzenia klucza obcego.
DanB
1

Lepszą opcją jest utworzenie nowej tabeli, skopiowanie wierszy do tabeli docelowej, usunięcie rzeczywistej tabeli i zmiana nazwy nowo utworzonej tabeli. Ta metoda jest dobra dla małych stołów,

ASHOK MANGHAT
źródło
3
Proponuję zebrać przykładowy kod, który będzie pasował do Twojej odpowiedzi. Zobacz, jak mam napisać dobrą odpowiedź
Frits