2016-03-31 6 views
1

Ich bin aufgrund der großen Indexgröße auf meinem Tisch mit einem Leistungsproblem in MySQL konfrontiert. Die Indexgröße ist auf 6 GB angewachsen und meine Instanz läuft auf 32 GB Arbeitsspeicher. Die Mehrheit der Zeilen wird in dieser Tabelle nach einigen Stunden nicht benötigt und kann selektiv entfernt werden. Aber sie zu entfernen ist eine zeitaufwendige Lösung und reduziert die Indexgröße nicht.Wie kann man die Indexgröße einer Tabelle in mysql mit der innodb engine reduzieren?

Bitte schlagen Sie eine Lösung vor, um diesen Index zu verwalten.

+0

, wie Sie wissen, dass Ihr Indexgröße 6GB ist, und es ist Aufgabe der Erstellung innodb_file_per_table aktiviert oder ot in Ihrem Setup .. .können Sie Ihr Tabellenschema mit "show create table your_table;" –

+0

Ich habe die Größe des Index von SHOW TABLE STATUS überprüft. –

+0

innodb_file_per_table ist auch aktiviert –

Antwort

0

können Sie optimieren Ihren Tabellenindex für den Wiederaufbau und Raum zurück, wenn auch nicht nach deletions-

optimize table table_name; 

Aber als Tisch zu bekommen ist sperrig, so dass es während optimze Tabelle sperren wird und auch stehen Sie Frage, wie kann alte Daten entfernen, selbst wenn Sie nicht wenige Stunden alte Daten benötigen. So können Sie wie folgt tun:

Schritt1: während der Nachtstunden oder wenn es weniger Verkehr auf Ihrem DB gibt, benennen Sie zuerst Ihre Haupttabelle um und erstellen Sie eine neue Tabelle mit demselben Namen. Fügen Sie nun einige Stunden Daten von alter Tabelle in neue Tabelle ein.

Dadurch können Sie unerwünschte Daten entfernen und auch neue Tabelle wird optimiert.

Schritt2: In Zukunft können Sie eine gespeicherte Prozedur erstellen, um dieses Problem zu vermeiden. Diese wird in den Nachtstunden nur 1 Mal pro Tag ausgeführt und löscht entweder die Daten aus dieser Tabelle bis zum vorherigen Tag (gemäß Ihrer Anforderung) oder verschiebt die Daten in eine beliebige historische Tabelle.

Schritt3: Da Ihre Tabelle immer nur einzelne Tagesdaten enthält, können Sie die Tabelle optimieren, um die Tabelle neu zu erstellen und Speicherplatz auf dieser Tabelle zu beanspruchen.

Hinweis: delete-Anweisung wird Index nicht neu erstellen und Speicherplatz auf Server nicht freigeben. Dafür müssen Sie Ihren Tisch optimieren. Es kann auf verschiedene Arten wie durch Änderung Aussage oder durch optimieren Aussage etc.

+0

Was passiert, wenn eine Update-Anfrage während der Übergangsphase auf alten Tisch kommt? Diese Anfrage wird fehlgeschlagen. –

+0

wie Sie sagen, dass nur wenige Stunden alt Daten nützlich sind..so zuerst erstellen Sie eine gleiche Tabelle mytable_new ... dann fügen Sie einige Stunden Daten aus der Haupttabelle in diese Tabelle .... jetzt müssen Sie nur beide Tabellen umbenennen .. ., die kaum Sekunde dauern sollte ... Sie können entweder alle Benutzer blockieren, wenn dies für Sie kritisch ist, oder Sie können Risiken in den späten Nachtstunden eingehen ... gemäß Ihrer Projektkritikalität .... –

0

Wenn Sie alle die Zeilen älter als X Stunden entfernen können, dann PARTITIONing ist der Weg zu gehen. PARTITION BY RANGE auf die Stunde und verwenden Sie DROP PARTITION, um eine alte Stunde zu entfernen und REORGANIZE PARTITION, um eine neue Stunde zu erstellen. Sie sollten X + 2 Partitionen haben. More details.

Wenn die Löschungen komplexer sind, geben Sie bitte weitere Einzelheiten an. vielleicht können wir uns eine andere Lösung einfallen lassen, die sich mit der Frage nach der Indexgröße beschäftigt. Bitte geben Sie SHOW CREATE TABLE ein.

Auch wenn Sie keine Partitionen zum Löschen verwenden können, kann nützlich sein, Partitionen für OPTIMIZE zu haben. Do nicht verwenden OPTIMIZE PARTITION; Es optimiert die gesamte Tabelle. Verwenden Sie stattdessen REORGANIZE PARTITION, wenn Sie sehen, dass Sie den Index verkleinern müssen.

Wie groß ist der Tisch?

Wie groß ist innodb_buffer_pool_size?

(6GB Index scheint nicht so schlecht, vor allem, da Sie 32 GB RAM.)

Verwandte Themen