Korzyści z uruchomienia zapytania OPTYMALIZACJA TABELI na serwerze MySQL DB

9

Chciałbym wiedzieć, jakie są korzyści [naprawdę praktyczne], które można uzyskać, uruchamiając OPTIMIZE TABLE tbl_namezapytanie na serwerze MySQL.

Sprawdziłem to raz i stwierdziłem, że po uruchomieniu to następne trafienie DB zajmuje dużo czasu może być spowodowane przeniesieniem fragmentów lub mniej więcej, ale kolejne trafienia wykazują pewną wydajność, nie jestem pewien, czy buforowanie kwerendy robi tę sztuczkę z samą optymalizacją lub samą optymalizacją robi to.

Czy ktoś może poprowadzić mnie z pewnymi wartościami rzeczywistej różnicy wydajności, jeśli to możliwe, żebym mógł kontynuować, ponieważ praca z MySQL zyskuje na sile w naszym projekcie.

Saravanan
źródło

Odpowiedzi:

7

Należy pamiętać, że OPTIMIZE TABLE nie wykonuje defragmentacji. Wewnętrznie OPTYMALIZUJ TABELĘ wykonuj kilka operacji (kopiowanie danych do pliku tymczasowego, odtwarzanie indeksów, przeliczanie statystyk indeksów). W rzeczywistości przykład, który mam, można wykonać ręcznie, jak pokazano.

Przykład: jeśli zoptymalizujesz mydb.mytable, wpisz następujące polecenie:

OPTIMIZE TABLE mydb.mytable;

Zauważ, że mysql wykonuje następujące działania pod maską:

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

Jest to bardzo przydatne w przypadku tabel, w których występuje duża liczba aktualizacji i usuwania

Wykonanie tego może osiągnąć dwie rzeczy

  1. Zapobiegaj przeszukiwaniu przez mysql fragmentów w tabeli podczas próby załadowania danych do fragmentów o odpowiedniej wielkości. Wyeliminowanie tych fragmentów ograniczy tę operację.

  2. Ponowne obliczenie statystyki indeksu pomaga Optymalizatorowi zapytań MySQL konstruować lepsze plany EXPLAIN. W przeciwnym razie zapytania mogą ulec pogorszeniu w czasie wykonywania, ponieważ Optymalizator zapytań MySQL postanowił zgadywać w planie EXPLAIN. Byłby to wyraźny objaw tabeli, która ma dużą liczbę aktualizacji i usuwania.

CAVEAT

Jeśli chodzi o buforowanie, buforowanie wymaga szybkiego nurkowania ze względu na skanowanie pełnego stołu. Strony indeksu MyISAM wpływają i wypływają z pamięci podręcznej kluczy MyISAM. W przypadku InnoDB dane i strony indeksowe wpływają i wypływają z puli buforów InnoDB.

RolandoMySQLDBA
źródło
Dzięki za odpowiedź. Z twojego punktu widzenia rozumiem, że lepiej korzystam z niektórych usług, takich jak zadanie cron, aby zaplanować optymalizację tabeli dla jednej z często aktualizowanych tabel, aby uzyskać lepszą wydajność. Ponadto korzystam z InnoDB dla tej tabeli. Czy to lepszy wybór. Ponadto znajduję sprzężenia HASH w programie SQL Server, które zostały sugerowane w celu poprawy wydajności zapytań. Czy możesz mi to wyjaśnić i uzyskać podobny do tego w MySQL. Daj mi również optymalizator zapytań SQL dla MySQL [wersja Windows7].
Saravanan
@savaranan: Optymalizator zapytań MySQL, o którym mówiłem, był wewnętrznym wbudowanym w MySQL. BTW Ponieważ tabela, którą chcesz zoptymalizować, to InnoDB, możesz pominąć kroki DISABLE KEYS i ENABLE KEYS. TABELĘ ANALIZOWĄ można również pominąć, ponieważ jest ona całkowicie bezużyteczna w tabelach InnoDB, ponieważ InnoDB ponownie oblicza swoje liczności tabel poprzez bliskie przybliżenia przy użyciu stron z indeksów BTREE, znanych jako nurkowania indeksowe.
RolandoMySQLDBA
@savaranan: Jeśli chodzi o indeksy HASH, InnoDB ma adaptacyjne indeksy skrótów ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). Istnieją również ładne sugestie dotyczące emulacji własnych indeksów skrótów i obsługi kolizji na podstawie stron 103-106 „High Performance MySQL” ( amazon.com/dp/0596101716 )
RolandoMySQLDBA