Jaka jest różnica między optymalizacją tabeli a analizą tabeli w mysql

29

Jaka jest różnica między optymalizacją tabeli a analizą tabeli w mysql? Przeczytałem dokumenty online, ale nie jestem pewien, jaka jest różnica.

Boolean
źródło

Odpowiedzi:

28

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;

MyISAM

Dla tabeli MyISAM mydb.mytable w datadir /var/lib/mysqlmasz 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.mytablezmniejszy pliki .MYDi .MYIdla tabeli.

To nie jest to samo dla InnoDB. Oto jak jest inaczej:

InnoDB ( włączony plik innodb_file_per_table )

Dane i indeksy każdej tabeli są przechowywane w zewnętrznym pliku obszaru tabel. For datadiris /var/lib/mysql i tabela mydb.mytablebędą przechowywane w następujący sposób:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Kiedy OPTIMIZE TABLE mydb.mytablejest wykonywany, mytable.ibdkurczy się.

InnoDB ( wyłączony plik_nodb_plik_pera )

Istniałby tylko /var/lib/mysql/mydb/mytable.frm. Wszystkie dane i strony indeksu dla tabeli mydb.mytablesą przechowywane w systemowym pliku obszaru tabel /var/lib/mysql/ibdata1.

Po OPTIMIZE TABLE mydb.mytableuruchomieniu 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

InnoDB Hydraulika

AKTUALIZACJA 26.02.2013, 22:33 EST

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 TABLEjako 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 TABLEz 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, UPDATEsi 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 TABLEW niektórych przypadkach pisałem posty o bezcelowości na InnoDB:

RolandoMySQLDBA
źródło
Myślę, że optymalizacja tabeli dla innodb nie jest obsługiwana. Dostałem wiadomość, indeks zostanie odtworzony. Jak to działa?
Boolean
@RolandoMySQLDBA Nie jestem pewien, co to znaczy, kiedy mówisz „nie możesz uruchomić OPTIMIZE TABLE”. Jeśli OPTIMIZE TABLEchodzi o tabelę InnoDB, MySQL wykonuje dla ciebie operacje ALTER TABLE ... ENGINE=InnoDBi ANALYZE TABLE ..., mówiąc: „zamiast tego odtwarzaj + analizuj tabelę”.
Michael - sqlbot
@ Michael-sqlbot Jak pokazano w mojej odpowiedzi, uruchomiłem 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;.
RolandoMySQLDBA
Racja, ale zapewniam, że stało się to dla ciebie natychmiast, ponieważ stół, na którym testowałeś, był bardzo mały. Gdy korzystasz OPTIMIZE TABLEz InnoDB, serwer faktycznie wykonuje ALTER TABLE ... ENGINE=InnoDBi jest ANALYZE TABLEza kulisami, zanim zwróci tę odpowiedź ... więc możesz naprawdę uruchomić OPTIMIZE TABLEna InnoDB i osiągnąć zamierzony efekt.
Michael - sqlbot
15

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.

Mitch Pszenica
źródło