2010-05-24 13 views
5

Ich habe 10mln Zeilen in meiner Tabelle in MySQL und 7 Indizes in dieser Tabelle. Wenn ich nun versuche, 8 hinzuzufügen, braucht es unendlich viel Zeit. Gibt es eine Möglichkeit, dieses Problem zu umgehen, einfach und schnell 8. Index hinzufügen?Wie Index schneller erstellen?

+0

Es sollte nicht unendlich sein. Bitte geben Sie Details zu Ihrem Tabellenschema und -index an. –

+0

Und wenn es "für immer" dauert, überprüfen Sie, ob Ihnen irgendwo der Speicherplatz ausgeht - das Erstellen von Indizes kann sehr viel temporären Speicherplatz erfordern. – nos

+0

Es ist ein Fehler von MySQL, dass jeder nächste Index mehr Zeit braucht. Ich habe 400 MB real und 1,6 MB swap mem, und es wird überhaupt nicht beim Erstellen Index verwendet, und ich habe wie 20 GB Speicherplatz –

Antwort

2

Dies ist eine der tausend Möglichkeiten, wie MySQL nur saugt. Mit dem Design ...

Details: http://lists.mysql.com/mysql/202489

und ist mir egal, ob ich das Karma für diese Antwort verlieren.

+0

Ja, es ist das Denken, über das ich spreche –

+0

Ich war schockiert, als ich sah, dass die Ausführung einer ALTER TABLE, um den Standardwert oder die NULL-Fähigkeit einer Spalte zu ändern, durch Kopieren der gesamten Tabelle und Neuanlage aller Indizes durchgeführt wurde. Diese Dinge brauchen sehr wenig Zeit auf anderen DMBSs; Der empfohlene Weg, dies für große Tabellen auf MySQL zu tun, war, mit dem Dateisystem herumzuhacken - die Tabellendefinition mit einer leeren Datendatei zu ändern und die gesamte Datendatei wieder an ihren Platz zu stellen. –

+1

Das Poster zu diesem Artikel ist völlig falsch. MySQL erstellt in vielen Fällen Tabellen neu, wenn Sie ALTER TABLE ausführen. Die Tabelle wird jedoch nie mehr als einmal pro ALTER-Anweisung neu erstellt. Darüber hinaus können Sie beliebig viele Änderungen mit einem einzigen ALTER vornehmen, wenn Sie wünschen. – MarkR

5

Nein, die Zeit, die zum Erstellen eines Index benötigt wird, ist direkt proportional zur Menge der Daten, die Sie haben. In MS SQL erstelle ich Indizes für eine Tabelle mit diesen vielen Datensätzen in etwa 10 Minuten.

EDIT: Nach dem Kommentieren, bitte näher auf unendlich. Per Definition sagst du, dass es nie endet, meine Antwort bezieht sich auf eine lange laufende Indexerstellung und nicht unendlich.

+0

Ja, es dauerte 15 Minuten –

+0

Dann sind Sie etwa so gut wie es geht. Die Indexierung ist eine sehr intensive Aufgabe, insbesondere bei vielen Datensätzen. –

0

Welchen Motor verwenden Sie? Die Implementierung von ALTER TABLE ... CREATE INDEX variiert erheblich.

Bei Verwendung von MyISAM erfordert jede Indexänderung eine vollständige Tabellenwiederherstellung. Dies ist dem Motor nicht eigen, sondern ein Fehler, der nie behoben wurde.

Mit InnoDB muss für die Erstellung eines sekundären Indexes keine Tabelle neu erstellt werden. Diese Optimierung ist jedoch nur verfügbar, wenn Sie das InnoDB-Plug-in (statt der älteren, ausgelieferten Engine) verwenden. Das Ändern des Primärschlüssels erfordert immer eine Neuerstellung, da es sich um einen Cluster handelt.

Die Neuerstellung der Tabelle (in jedem Fall) erfordert eine Menge Arbeit, da sie alle vorhandenen Indizes neu erstellen und die Zeilen neu schreiben muss, um den Vorgang abzuschließen. Wenn Ihr Tisch in RAM passt (10M Zeilen klingt wie es sollte leicht tun), ist dies relativ schnell.

Der Umbau eines Tischs, der nicht in den Widder passt, ist ziemlich teuer. Ich empfehle, dass er wenn möglich vermieden wird.

Der Wiederaufbau eines individuellen Index, der nicht in RAM passt, ist sehr teuer und wird am besten vermieden.

Wie oft müssen Sie neue Indizes hinzufügen? Vielleicht können Sie die Tabellen mit dem bereits erstellten Index füllen?