Umgang mit einem großen Tisch in MySQL

7

Ich habe eine wirklich große Tabelle (ca.> 100.000.000 Zeilen und eine Größe von> 50 GB) und es wird gerade ein großer Performance-Kill. Unter dem Primärschlüssel (ID) wird ein Volltextschlüssel in einem Varchar (500) -Feld verwendet, um die MySQL-Volltextsuchoption zu verwenden.

Das Speichern und Abrufen von Zeilen in dieser Tabelle wird derzeit jedoch sehr langsam. Wie kann ich damit umgehen? Dies ist mein erstes Problem. Mein zweites Problem ist, dass das Abrufen eines Backups mit mysqldump dieser Tabelle keinen Sinn macht, da es Monate dauern würde, es wieder zu importieren. Das dritte Problem ist, dass diese Tabelle die Engine MYISAM verwendet und eine Konvertierung in INNODB ebenfalls nicht möglich ist (ich habe sie getestet und den Vorgang nach 72 Stunden abgebrochen).

Was wäre also ein guter zukunftssicherer Ansatz, um diese Tabelle zu beschleunigen, korrekt zu sichern und möglicherweise in INNODB zu konvertieren? (INNODB sollte FULLTEXT mit meiner MySQL-Version akzeptieren)


quelle

Antworten:

4

Ich würde einen radikaleren Ansatz vorschlagen. Für Datenbanken Ihrer Größe ist eine Volltextsuche nicht nur ineffektiv, sondern auch ineffizient. Ich vermute, dass es eine Art benutzergesteuerte Suchfunktion gibt, die Ihren Index erfordert.

Wie wäre es mit einer echten Suchmaschine? Dies würde die Last der Schlüsselgenerierung und Neuordnung von Ihrer Datenbank entlasten. Dies gibt Ihnen die Möglichkeit, die Last auf einen anderen Computer zu verlagern.

Schauen Sie sich Apache Solr an , eine gut aufgenommene, schnelle Implementierung, die auf Lucene basiert . Viele große gemeinnützige und kommerzielle Websites nutzen es mit Erfolg.

Entfernen Sie dann die Volltextindizierung aus Ihrer Tabelle. Einfügungen sollten dann nur noch mit dem ID-Schlüssel in die Tabelle fliegen.

Wenn Sie regelmäßig Zeilen aus der Tabelle entfernen, sollte OPTIMIZE TABLE regelmäßig durchgeführt werden.

Für Sicherungszwecke können Sie eine Replikation in Betracht ziehen . Es gibt mehrere Möglichkeiten, die Replikation zu implementieren, und alle verteilen die Last im Laufe der Zeit, anstatt Ausfallzeiten zu verursachen, wie Sie es jetzt haben. Als zusätzlichen Vorteil können einige Replikationen eine Datenbank erzeugen, die als Ersatz für einen Ersatz verwendet werden kann, wenn die Primärdatenbank ausfällt, sodass die Anwendung in kürzester Zeit wieder hochgefahren werden kann.

0xCAFEBABE
quelle
Ich denke, Elastic Search ist einfacher zu implementieren als Solr (am Ende basiert es immer noch auf Lucene). Es gibt auch Cloud-basierte Dienste wie searchify.com, mit denen Sie Ihre Dokumentensuche auslagern können (wenn Sie Cloud nicht als Wort mit vier Buchstaben betrachten)
atxdba
1

Dies ist keine einfache Frage, deren Beantwortung weitere Anstrengungen erfordert.

Veröffentlichen Sie zunächst Ihr Tabellenschema, damit die Benutzer einen genaueren Blick darauf werfen können.

Einige allgemeine Ratschläge:

Performance

Um herauszufinden , was Ihre Leistung ist das Essen, versuchen Sie Ihre Aussagen Profilierungs welche INSERTing und SELECTing Reihen.

Beispiel:

  1. Schalten Sie den Profiler ein:

    SET-Profilerstellung = 1;

  2. Führen Sie Ihre INSERToder SELECT-Anweisung aus.

  3. Zeigen Sie das Ergebnis des Profilers an:

    PROFILE ANZEIGEN;

Dies wird ungefähr so ​​zurückgeben:

Query_ID |  Duration | Query
---------+-----------+-----------------------
  ...    | ...       | ...   
   29    | 0.0006200 | SHOW STATUS
   30    | 0.3600000 | (your query here)
  ...    | ...       | ...

Zeigen Sie in diesem Beispiel die Details für Query_ID 30:

SHOW PROFILE FOR QUERY 30; 

... und Sie werden sehen, was der langsame Teil dieser Aussage ist. Abhängig vom Grund können Sie Maßnahmen zur Optimierung des Verhaltens ergreifen, auch wenn es sich um einfache hardwarebezogene Dinge wie schnellere Festplatten usw. handelt.

Backup

Bei riesigen Tabellen wie diesen mysqldumpdauern herkömmliche Backups nur sehr lange. Möglicherweise möchten Sie verschiedene Sicherungsstrategien in Betracht ziehen. Wenn Sie MyISAM verwenden, ist es möglicherweise viel schneller, eine dateibasierte Sicherung auf einer anderen Partition zu verwenden und die Dateien dann auf Ihr Sicherungsgerät zu verschieben. Vielleicht möchten Sie auch nach professionellen Alternativen suchen, nach Percona XtraBackup oder ähnlichen Tools.

Ein anderer Ansatz wäre das Einrichten der Replikation .

InnoDB

Seit MySQL 5.6 können Sie auch in InnoDB Volltext verwenden. Es verspricht signifikante Leistungssteigerungen, die ich bisher noch nicht ausprobiert habe. Bitte beachten Sie, dass dies Ihr System in mehrfacher Hinsicht beeinflusst:

Björn
quelle
0

Wenn Ihre Tabelle hauptsächlich in WRITING-Aktionen (INSERT / UPDATE) verwendet wird, sollten Sie MyISAM verwenden.

Wenn Ihre Tabelle hauptsächlich für READING-Aktionen (SELECT) verwendet wird, sollten Sie InnoDB verwenden.

Sie sollten jedoch in Betracht ziehen, Ihre Tabelle zu verwalten und den Spalten einen entsprechenden Index hinzuzufügen.

Raubvogel
quelle
Ich benutze gerade MyISAM und trotzdem dauert das Schreiben in die Tabelle zu lange ...
Ich kenne. Versuchen Sie, die Daten zu verwalten. (ps poste auch dein Schema)
Raptor
Das Schema lautet latin1_swedish_ci. Also sollten REPAIR und OPTIMIZE den Trick machen? Ich werde das versuchen. Gibt es weitere Tricks, um die Geschwindigkeit zu optimieren?
1
Archivieren Sie alte Daten, wenn sie nicht verwendet werden.
Raptor
0

Benötigen Sie alle Daten in dieser Tabelle oder können Sie einige davon löschen?

Wenn Sie Zugriff auf alle Daten benötigen, können Sie diese in ein "heißes" Set, auf das Sie regelmäßig zugreifen müssen, und ein "kaltes" Set, auf das Sie gelegentlich zugreifen müssen, unterteilen?

Welche Art von Abfragen führen Sie aus? Könnten Sie einige der Daten in einer anderen Tabelle zum Abfragen zusammenfassen? Wenn Sie beispielsweise die Anzahl der Felder abrufen, können Sie die Anzahl einfach in einer anderen Tabelle speichern / aktualisieren.

Erzählen Sie uns mehr.

Valerie Parham-Thompson
quelle