Ich habe einen Tisch mit 1,4 Milliarden Datensätzen. Die Tabellenstruktur ist wie folgt:
CREATE TABLE text_page (
text VARCHAR(255),
page_id INT UNSIGNED
) ENGINE=MYISAM DEFAULT CHARSET=ascii
Die Anforderung besteht darin, einen Index über der Spalte zu erstellen text
.
Die Tischgröße beträgt ca. 34G.
Ich habe versucht, den Index mit der folgenden Anweisung zu erstellen:
ALTER TABLE text_page ADD KEY ix_text (text)
Nach 10 Stunden Wartezeit gebe ich diesen Ansatz endlich auf.
Gibt es eine praktikable Lösung für dieses Problem?
UPDATE : Es ist unwahrscheinlich, dass die Tabelle aktualisiert, eingefügt oder gelöscht wird. Der Grund für die Erstellung eines Index für die Spalte text
liegt darin, dass diese Art von SQL-Abfrage häufig ausgeführt wird:
SELECT page_id FROM text_page WHERE text = ?
UPDATE : Ich habe das Problem durch Partitionieren der Tabelle gelöst.
Der Tisch ist in 40 Teile auf einer Säule unterteilt text
. Das Erstellen des Index für die Tabelle dauert ungefähr 1 Stunde.
Es scheint, dass die Erstellung des MySQL-Index sehr langsam wird, wenn die Tabellengröße sehr groß wird. Durch die Partitionierung wird die Tabelle in kleinere Amtsleitungen aufgeteilt.
CREATE INDEX
Anweisung?Antworten:
Könnte es sein, dass Ihr System der Aufgabe einfach nicht gewachsen ist? Ich verwende MySQL (hier SQL Server) nicht, aber ich kenne den Schmerz, eine 800-Millionen-Eintragstabelle zu indizieren. Grundsätzlich ... benötigen Sie dafür die richtige Hardware (wie in: viele schnelle Discs). Ich benutze jetzt fast ein Dutzend Velociraptoren und die Leistung ist großartig;)
SQL Server (nicht als MS SQL Server, sondern als Datenbankserver, die SQL verwenden) leben und sterben mit Datenträgerzugriff, und normale Datenträger sind für größere Vorgänge einfach nicht geeignet.
quelle
Möglicherweise möchten Sie einen Index für die ersten (z. B. 10) Zeichen des Textfelds erstellen.
Aus den Dokumenten:
Es können Indizes erstellt werden, die nur den führenden Teil der Spaltenwerte verwenden. Dabei wird die Syntax col_name (length) verwendet, um eine Indexpräfixlänge anzugeben:
quelle
Ich habe das Problem durch Partitionieren der Tabelle gelöst.
Der Tisch ist in 40 Teile auf einer Säule unterteilt
text
. Das Erstellen des Index für die Tabelle dauert ungefähr 1 Stunde.Es scheint, dass die Erstellung des MySQL-Index sehr langsam wird, wenn die Tabellengröße sehr groß wird. Durch die Partitionierung wird die Tabelle in kleinere Amtsleitungen aufgeteilt.
quelle
Setzen Sie sort_buffer_size auf 4 GB (oder wie viel Sie können, je nachdem, wie viel Speicher Sie haben).
Im Moment führt der Erstellungsindex eine Sortierung durch, aber da Sie eine sort_buffer_size von 32 MB haben, wird die Festplatte im Grunde genommen unnötig überlastet.
quelle
Wenn Sie keine Fragen stellen müssen wie:
Ich würde vorschlagen, eine neue Hash-Spalte zu erstellen und die Tabelle nach Spalten zu indizieren. Die Gesamtgröße der Tabelle + des Index ist möglicherweise viel kleiner.
UPD : Übrigens belegen 1,4 Milliarden Ganzschlüssel-Ganzzahlen etwa 6 GB, dh die durchschnittliche Länge der Zeichenfolge beträgt weniger als 30 Zeichen. Eine Indizierung nach einem Präfix ist möglicherweise vorzuziehen.
Sie sollten sich auch die MERGE Storage Engine ansehen .
quelle
Eine Möglichkeit, dies zu tun, besteht darin, eine neue Tabelle mit dem eingestellten Index zu erstellen und die Daten in die neue Tabelle zu kopieren.
Stellen Sie außerdem sicher, dass Sie genügend temporären Speicherplatz haben.
quelle
Für den Fall, dass Sie sich immer noch fragen, wie Sie dies am besten tun können, würde ich Ihnen empfehlen, ein Online-Tool zum Ändern von Tabellen zu verwenden.
Es gibt viele davon im Internet, eine der bekanntesten ist:
http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
Wir haben die gleichen Probleme mit großen Tischen (mehr als 500mil Datensätze) und die Änderung geht perfekt. Es erstellt eine neue tmp-Tabelle, fügt der ursprünglichen Tabelle einen Trigger hinzu (für die neuen Datensätze zum Aktualisieren / Löschen / Einfügen) und kopiert in der Zwischenzeit alle Datensätze in die neue Tabelle (mit der neuen Struktur).
Viel Glück!
quelle