2009-08-31 2 views
10

Ich habe eine MySQL-Datenbank mit einer MyISAM-Tabelle mit 4 Millionen Zeilen. Ich aktualisiere diese Tabelle ungefähr einmal pro Woche mit ungefähr 2000 neuen Reihen. Nach der Aktualisierung ändern ich dann die Tabelle wie folgt aus:MySQL ALTER TABLE auf sehr großen Tisch - ist es sicher, es zu betreiben?

ALTER TABLE x ORDER BY PK DESC 

ich die Tabelle durch den Primärschlüsselfeld bestellen in absteigender Reihenfolge. Das hat mir auf meinem Entwicklungsrechner (Windows mit 3GB Speicher) keine Probleme bereitet. Dreimal habe ich es erfolgreich auf dem Linux-Produktionsserver versucht (mit 512MB RAM - und die sortierte Tabelle in jeweils ca. 6 Minuten erreicht), beim letzten Mal musste ich die Abfrage nach ca. 30 Minuten anhalten und neu aufbauen Datenbank von einem Backup.

Kann ein 512MB Server mit dieser alter-Anweisung auf einer so großen Tabelle zurechtkommen? Ich habe gelesen, dass eine temporäre Tabelle erstellt wird, um den ALTER TABLE-Befehl auszuführen.

Frage: Kann dieser Befehlsänderung sicher ausgeführt werden? Was sollte die erwartete Zeit für die Änderung der Tabelle sein?

+1

Ich denke, "sehr große Tabelle" ist wahrscheinlich eine Übertreibung. 4M Zeilen ist keine sehr große Tabelle. 1bn könnte möglicherweise sein. – MarkR

Antwort

0

Ich würde wahrscheinlich stattdessen eine Ansicht erstellen, die nach dem PK-Wert sortiert ist, so dass Sie zum einen die riesige Tabelle nicht sperren müssen, während der ALTER ausgeführt wird.

+0

Danke für die Antwort ... Die Sache ist, ich habe nichts dagegen, die Tabelle während des Updates zu sperren, da es sowieso offline sein wird ... –

+0

Ich glaube nicht, dass eine Ansicht hier helfen wird. MySQL hat [zwei Strategien] [1] für die Ansichtsauflösungen: "MERGE" und "TEMPTABLE". Wenn Sie die Zusammenführung verwenden, erhalten Sie keinen Vorteil, da die Definition einfach mit der übermittelten SELECT-Anweisung zusammengeführt wird. 'TEMPTABLE', wie der Name schon sagt, erstellt eine temporäre Tabelle. Aber so wie es aussieht, ist die Erstellung der temporären Tabelle die Ursache des ursprünglichen Problems. Sie würden also nichts gewinnen, außer die Wartung zu erschweren. [1]: http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html – exhuma

3

Wie ich gerade gelesen habe, ist die Abfrage ALTER TABLE ... ORDER BY ... nützlich, um die Leistung in bestimmten Szenarien zu verbessern. Ich bin überrascht, dass der PK-Index hier nicht hilft. Aber von the MySQL docs scheint es, dass InnoDB den Index verwendet. InnoDB neigt jedoch dazu, langsamer als MyISAM zu sein. Das heißt, mit InnoDB müssten Sie die Tabelle nicht neu ordnen, aber Sie würden die rasende Geschwindigkeit von MyISAM verlieren. Es kann immer noch einen Versuch wert sein.

Die Art, wie Sie die Probleme erklären, scheint, dass zu viele Daten in den Speicher geladen werden (vielleicht gibt es sogar einen Austausch?). Sie können dies leicht überprüfen, indem Sie die Speichernutzung überwachen. Es ist schwer zu sagen, da ich MySQL nicht so gut kenne.

Auf der anderen Seite, denke ich, Ihr Problem liegt an einem ganz anderen Ort: Sie verwenden eine Maschine mit nur 512 Megabyte RAM als Datenbankserver mit einer Tabelle mit mehr als 4 Millionen Zeilen ... Und Sie führen eine sehr speicherintensive Bedienung auf dem ganzen Tisch dieser Maschine. Es scheint, dass 512Megs nicht annähernd genug dafür sind.

Ein viel grundsätzlicheres Thema, das ich hier sehe: Sie machen Entwicklung (und wahrscheinlich auch Testen) in einer Umgebung, die sich sehr von der Produktionsumgebung unterscheidet. Die Art von Problem, die Sie erklären, ist zu erwarten. Ihre Entwicklungsmaschine hat sechsmal so viel Speicher wie Ihre Produktionsmaschine. Ich glaube, ich kann sicher sagen, dass der Prozessor auch viel schneller ist. In diesem Fall schlage ich vor, dass Sie eine virtuelle Maschine erstellen, die Ihre Produktionsumgebung nachahmt. Auf diese Weise können Sie Ihr Projekt einfach testen, ohne die Produktionsstätte zu stören.

+0

Die jüngsten Verbesserungen an InnoDB haben es in den meisten Szenarien auf Augenhöhe mit MyISAM gebracht. –

+0

@Bill: Interessant. Also könnte man sagen, dass InnoDB wirklich der richtige Weg ist? Gleiche Leistung, mehr Funktionen. Nachdem ich dein Profil gesehen habe, glaube ich, dass ich dir glauben kann. Hast du noch irgendwelche Beweise dafür? – exhuma

0

Worauf Sie es beziehen, ist die gesamte Tabelle und alle ihre Indizes neu zu erstellen; Dies ist eine teure Operation, insbesondere wenn die Daten nicht in RAM passen. Es wird abgeschlossen, aber es wird erheblich langsamer, wenn die Daten nicht in RAM passen, besonders wenn Sie viele Indizes haben.

Ich bezweifle Ihr Urteil, wenn Sie eine Maschine mit so wenig Speicher in der Produktion ausführen. Anyway:

  • Ist das ALTER TABLE wirklich notwendig; Welche spezifische Abfrage versuchen Sie zu beschleunigen, und haben Sie es ohne versucht?
  • Haben Sie darüber nachgedacht, Ihre Entwicklungsmaschine mehr wie eine Produktion zu machen?Ich meine, eine Dev-Box mit MEHR Speicher ist nie eine gute Idee, und ein anderes Betriebssystem ist definitiv auch nicht.

Es gibt wahrscheinlich auch eine Abstimmung, die Sie tun können, um zu helfen; Es hängt weitgehend von Ihrem Schema (insbesondere Indizes) ab. 4M Zeilen sind nicht sehr viele (für eine Maschine mit normalen Mengen von RAM).

+0

Hallo Mark ... danke für deine Antwort ... Die Grenze für Speicher ist aufgrund von Budget Überlegungen ... Ich dachte, wenn die Website erwischt würde ich die Spezifikationen des Servers aktualisieren ... Allerdings der Grund für ALTER zu machen ist, dass Benutzer eine gespeicherte Prozedur ausführen können, die diese Tabelle abfragt, und ich möchte die Ergebnisse in der Reihenfolge von "zuletzt eingefügt zuerst" zurückgeben. Ich kann dies mit einem ORDER BY in der Abfrage selbst erreichen, aber leider scheint dies sehr teuer zu sein und verlangsamt die Abfragen erheblich ... Wenn ich also die Tabelle aktualisiere, sortiere ich normalerweise durch PK desc, um diese ORDER BY zu überspringen. –

+0

Sie sollten einen entsprechenden Index erstellen, damit die ORDER BY-Abfrage nicht sortiert werden muss. Sie können dies mit EXPLAIN überprüfen (nur wenn die Abfrage nicht in einem SP ist). ALTER TABLE ... ORDER BY ist keine Lösung, da es nicht garantiert, dass die Daten geordnet bleiben. – MarkR

+0

Hallo Mark. Ich habe 8 Indizes auf dieser Tabelle. Wenn ich das PK-Feld (das ich mit desc anordnen möchte) am äußersten rechten Teil jedes dieser Indizes anfüge, werden die Indizes weiterhin verwendet, um die WHERE-Klausel zu erfüllen, und obwohl das Bestellfeld nicht ganz links ist Präfix des Index (wie ich es ganz rechts von jedem Index hinzufügen werde), kann es immer noch für die ORDER BY verwendet werden? Vielen Dank. –

0

Wenn Sie InnoDB verwenden, müssen Sie die ORDER BY entweder nach dem Einfügen oder zur Abfragezeit nicht explizit ausführen. Laut Handbuch 5.0 MySQL, InnoDB bereits standardmäßig auf Primärschlüssel Bestellung für Abfrageergebnisse:

http://dev.mysql.com/doc/refman/5.0/en/alter-table.html#id4052480

MyISAM-Tabellen Datensätze zurück in Auftrag standardmäßig statt, die auch funktionieren, wenn Sie überhaupt nur anhängen zu die Tabelle, anstatt eine Abfrage UPDATE zu verwenden, um alle Zeilen direkt zu ändern.

1

ist der Primärschlüssel auto_increment? Wenn dem so ist, dann wird ALTER TABLE ... ORDER BY nichts verbessern, da sowieso alles in der Reihenfolge eingefügt wird.

(es sei denn, Sie haben viele löscht)

+0

Danke für die Antwort. Das Problem ist jedoch, dass ich die Ergebnisse in umgekehrter Reihenfolge der Reihenfolge der Primärschlüssel geben möchte ... –

+1

dann müssen Sie Ihre gespeicherten Prozeduren, Abfragen und Servereinstellungen optimieren und nicht schwarzmagische Dinge wie ALTER TABLE ausprobieren, das funktioniert nur wegen einer Eigenheit in myisam Tabellen. Wenn die Leistung Ihrer gespeicherten Prozeduren und Abfragen leidet, wenn Sie sie sortieren, sollten Sie eine neue Frage öffnen und die CREATE TABLE-Anweisung, die Abfrage/Prozedur und die EXPLAIN-Ausgabe bereitstellen. Dann können wir Ihnen helfen, die Abfrage oder Ihre Serverkonfiguration zu optimieren. – longneck

Verwandte Themen