Frage

Ich habe eine MyISAM-Tabelle in der Produktion auf mySQL läuft, und durch ein paar Tests machen, haben wir festgestellt, wir können eine Abfrage beschleunigen enorm durch eine bestimmte Verbindung Index hinzugefügt wird. So weit, ist es gut. Allerdings ist mir nicht wirklich über den besten Weg, um diesen Index in einer Produktionsumgebung hinzuzufügen, ohne die Tabelle für eine lange Zeit zu Verriegelung (es ist 27GBs von Daten bekommen, also nicht so viel, aber es dauert eine Weile).

Haben Sie Tipps? Wenn dies ein anspruchsvolleres Setup ist natürlich würden wir eine Live-Nachbildung aller Daten auf einer anderen Maschine, und wir könnten sicher wechseln. Leider sind wir noch nicht da, und ich würde diese Abfrage so schnell wie möglich beschleunigen möchte (es große Kunden Kopfschmerzen verursacht). Gibt es eine einfache Möglichkeit, die Daten zu replizieren und dann einen Swap-outen Trick? Einige andere Tricks, die ich fehle?

UPDATE: Lesen über "Online-Index-Operationen" in SQL Server macht mich sehr neidisch http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

Danke!

War es hilfreich?

Lösung

können Sie die Replikation verwenden, Ausfallzeiten in der Größenordnung von ein paar Minuten zu bekommen, statt den Stunden könnte es dauern, einen Index für die Tabelle zu erstellen.

den Slave einzurichten, finden Sie unter http: //dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

eine Empfehlung ich den Prozess in Schritt beschleunigen zu helfen, kann 2 folgen Sie dem „Erstellen ein Datum Snapshot Verwendung von Raw Data Files“ -Methode. sondern das Kopierens über den Draht an den Slave, Kopie an einen anderen Ort auf dem Master. und bringen den Meister so schnell nach oben in die Kopie fertig ist und Sie haben die notwendigen Änderungen an der Konfigurationsdatei (Set-Server-ID und aktiviert Binärlogging) gemacht. dies wird Ihre Ausfallzeiten auf nur eine oder zwei Minuten zu minimieren. sobald der Server wieder nach oben ist, können Sie die kopierten Dateien auf die Slave-Box kopieren.

Sobald Sie den Slave und läuft und Sie haben überprüft alles repliziert richtig , können Sie

Andere Tipps

ich mit Randy bin. Wir haben in einer ähnlichen Situation gewesen, und es gibt zwei Möglichkeiten, in MySQL so etwas wie dies zu tun:

  1. Nehmen Sie den Server herunter, während er läuft. Dies ist, was Sie wahrscheinlich tun. Es ist einfach, es ist einfach, es funktioniert. Zeit zu tun? Vielleicht eine halbe Stunde / 45 Minuten, abhängig von Plattenbandbreite. Siehe unten.

  2. Erstellen Sie eine neue Tabelle mit dem neuen Index, kopieren Sie alle Daten über, Pause der Server die erste Tabelle löschen, die neuen zu den alten Namen ändern, den Server starten. Ausfallzeit? 10 Minuten, vielleicht, aber wirklich kompliziert.

Option zwei Werke, und erspart Ihnen die Ausfallzeiten den Index zu erstellen (wenn es dauert eine lange Zeit). Aber es braucht mehr Platz, es komplizierter ist (da Sie mit den neuen Datensätzen beschäftigen müssen die Haupt-Tabelle eingefügt ab, und es wird wahrscheinlich auf MyISAM sperren, während das Kopieren der Daten aus. Eine Tabelle löschen, wird einige Zeit dauern, die Änderung der Tabelle der neue Name wird noch einige Zeit in Anspruch nehmen. es ist einfach wirklich kompliziert. Wenn Sie eine 2 TB Tabelle haben dies nützlich sein könnte, aber für 27G es ist wahrscheinlich übertrieben.

Haben Sie einen zweiten Server, der in Spezifikationen zu dem Produktionsserver Nähe? Laden Sie das neueste Backup und tun den Index gibt, so dass Sie wissen, wie lange es dauern wird, hinzuzufügen. Dann gilt für Ausfallzeiten planen.

InnoDB ist besser über viele Dinge, aber neue Indizes sperren noch die Tabelle. Diese Fähigkeiten, die MSSQL (und ich denke, PostgreSQL) haben diese Art von Dingen zu tun, ohne wäre toll zu sperren.

Finden Sie Ihre geringe Nutzung Fenster und nehmen Sie Ihre Anwendung offline während der Indexerstellung. Da Sie nicht die Replikation oder einen Multi-Master-oder was auch immer, wirst du nur auf diesen einen, die Kugel zu beißen haben. Wir sehen uns bei 01.00. : -)

Nicht viel Sie können hier mit einem Server tun.

Wenn Sie die Tabelle und machen einen Trockenlauf zu kopieren, zumindest werden Sie herausfinden, wie lange es ohne Verriegelung der Live-Tabelle nehmen wird, so dass Sie einige Wartungszeit bei Bedarf planen kann, oder eine Entscheidung treffen, ob können Sie nur auf den Knopf drücken und Benutzer für ein paar Minuten hängen lassen:)

Oder es für eine ruhige Zeit einzuplanen ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
scroll top