Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Index auf InnoDB neu aufbauen

Haben Sie SHOW TABLE STATUS gemacht? vor und nach deinem drop+rebuild? Ändert sich Index_length stark? Wahrscheinlich nicht einmal um den Faktor zwei.

Ich empfehle fast nie, etwas in InnoDB neu zu erstellen. Es lohnt sich nicht. Eine eklatante Ausnahme hat mit FULLTEXT zu tun Indizes.

Ja, der Dummy ALTER erstellt die Indizes neu. So auch OPTIMIZE TABLE . Beide "defragmentieren" (bis zu einem gewissen Grad) die sekundären Index-BTrees und den Haupt-BTree (der die Daten und den PRIMARY KEY enthält). ).

Die Statistiken können viel sein billiger aktualisiert mit nur ANALYZE TABLE . Auch das wird nicht oft benötigt. 5.6 hat eine viel bessere Möglichkeit, die Statistiken zu pflegen.

Falls Sie innodb_file_per_table=ON noch nicht verwenden , ich schlage vor, Sie setzen das (SET GLOBAL ... ) und führen Sie ALTER TABLE tbl ENGINE=InnoDB; aus ein letztes Mal.

Online-Änderung

Um ft_* zu ändern , müssen Sie den Index neu erstellen. Dies impliziert ein ALTER (oder OPTIMIZE , die als ALTER implementiert ist ). Neuere Versionen von MySQL haben ALGORITHM=INPLACE was ALTER ergibt haben wenig oder keine Auswirkungen auf das laufende System. Aber es gibt Einschränkungen. Überprüfen Sie das Handbuch.

Eine Alternative zu einem Nicht-INPLACE ALTER ist pt-query-digest oder gh-ost . Prüfen Sie, ob einer von ihnen für Ihren Fall geeignet ist.

Außer "die Tabelle neu aufzubauen", können Sie DROP INDEX ... und ADD INDEX ... . Auch hier weiß ich nicht, ob diese für FT-Indizes "inplace" funktionieren. Wie auch immer, Sie würden die Verwendung dieses Index während des Prozesses verlieren.