Odpowiedzi:
Aby rozwinąć odpowiedź @ MitchWheat (+1 za bezpośrednie udzielenie pierwszej odpowiedzi):
TABELA ANALIZOWA analizuje dystrybucję kluczy i przechowuje je w INFORMACJE_SCHEMA.STATYSTYKA .
OPTYMALIZUJ TABELĘ wykonuje ANALIZĘ TABELI po kompresji tabeli. Odpowiednikiem tego,OPTIMIZE TABLE mydb.mytable;
jeśli tabelą był MyISAM, jest:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Dla tabeli MyISAM mydb.mytable w datadir /var/lib/mysql
masz następujące pliki:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(dane)/var/lib/mysql/mydb/mytable.MYI
(indeksy)OPTIMIZE TABLE mydb.mytable
zmniejszy pliki .MYD
i .MYI
dla tabeli.
To nie jest to samo dla InnoDB. Oto jak jest inaczej:
Dane i indeksy każdej tabeli są przechowywane w zewnętrznym pliku obszaru tabel. For datadir
is /var/lib/mysql
i tabela mydb.mytable
będą przechowywane w następujący sposób:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Kiedy OPTIMIZE TABLE mydb.mytable
jest wykonywany, mytable.ibd
kurczy się.
Istniałby tylko /var/lib/mysql/mydb/mytable.frm
. Wszystkie dane i strony indeksu dla tabeli mydb.mytable
są przechowywane w systemowym pliku obszaru tabel /var/lib/mysql/ibdata1
.
Po OPTIMIZE TABLE mydb.mytable
uruchomieniu strony danych i indeksu są zapisywane w ibdata1 w sposób ciągły. Niestety, powoduje to, że ibdata1 rośnie skokowo.
Zobacz obrazowe przedstawienie CTO Percona Vadima Tkachenko
Twój komentarz był
Myślę, że optymalizacja tabeli dla innodb nie jest obsługiwana. Dostałem wiadomość, indeks zostanie odtworzony. Jak to działa?
Wypróbowałem to
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
Masz rację. Nie można uruchomić OPTIMIZE TABLE
jako pojedynczej operacji. Zamiast tego działa InnoDB:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
Możesz również po prostu uruchomić te kroki samodzielnie.
Jednak, szczerze mówiąc, nie powinieneś być zmuszony do uruchamiania ANALYZE TABLE
z tabelą InnoDB, ponieważ za każdym razem, gdy wykonywane jest zapytanie, silnik pamięci InnoDB dokonuje oszacowania liczności tabeli na podstawie przechodzenia między stronami w indeksach. Jeśli istnieje duża liczba INSERTs
, UPDATEs
i DELETEs
, a następnie będzie trzeba ANALYZE TABLE
. Gdy jest ich duża liczba DELETEs
, ALTER TABLE mydb.mytable ENGINE=InnoDB;
konieczne jest zmniejszenie tabeli.
ANALYZE TABLE
W niektórych przypadkach pisałem posty o bezcelowości na InnoDB:
Oct 16, 2011
: Nagle trzeba odbudować indeksy, aby zapobiec awarii stronyJun 21, 2011
: Skąd MySQL Query Optimizer odczytuje statystyki indeksu?OPTIMIZE TABLE
”. Jeśli OPTIMIZE TABLE
chodzi o tabelę InnoDB, MySQL wykonuje dla ciebie operacje ALTER TABLE ... ENGINE=InnoDB
i ANALYZE TABLE ...
, mówiąc: „zamiast tego odtwarzaj + analizuj tabelę”.
OPTIMIZE TABLE dat;
MySQL 5.5.29 i natychmiast narzekałem Table does not support optimize, doing recreate + analyze instead
. Właśnie dlatego polecam ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
.
OPTIMIZE TABLE
z InnoDB, serwer faktycznie wykonuje ALTER TABLE ... ENGINE=InnoDB
i jest ANALYZE TABLE
za kulisami, zanim zwróci tę odpowiedź ... więc możesz naprawdę uruchomić OPTIMIZE TABLE
na InnoDB i osiągnąć zamierzony efekt.
Zależy od twojej wersji MySQL i silnika pamięci, ale ogólnie:
OPTYMALIZUJ TABELĘ Analizuje tabelę, przechowuje rozkład kluczy dla tabeli, odzyskuje nieużywane miejsce i defragmentuje plik danych.
TABELA ANALIZOWA Analizuje tylko tabelę i przechowuje rozkład kluczy.