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?

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”.


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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

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>;

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,


3
Proponuję zebrać przykładowy kod, który będzie pasował do Twojej odpowiedzi. Zobacz, jak mam napisać dobrą odpowiedź
— Frits
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.