Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Große Anzahl von Spalten, Alles auswählen dauert ewig

InnoDB speichert "breite" Tabellen auf andere Weise. Anstatt alle Spalten in einer einzigen Zeichenfolge zusammenzufassen (plus Overhead, wie Längen usw.), macht es Folgendes:

  • Wenn die Summe aller Spalten für eine bestimmte Zeile etwa 8 KB überschreitet, werden einige der Daten in einen anderen ("off-record") Speicherbereich verschoben.
  • Welche Spalten aus dem Datensatz verschoben werden, hängt von der Größe der Spalten usw. ab.
  • Die Details hängen vom ROW_FORMAT ab gewählt.
  • "Off-record" ist ein weiterer 16-KB-Block (oder -Blöcke).
  • Später, wenn Sie SELECT * ausführen (oder zumindest die Off-Record-Spalte(n) abrufen), muss es einen weiteren Festplattenabruf durchführen.

Was tun?

  • Überdenken Sie, so viele Spalten zu haben.
  • Betrachten Sie "vertikale Partitionierung", bei der Sie eine oder mehrere andere Tabellen haben, die ausgewählten TEXT enthalten Säulen. Schlagen Sie die Auswahl von Spaltengruppen basierend auf Zugriffsmustern in Ihrer App vor.
  • Erwägen Sie für normalerweise recht lange Spalten, sie im Client zu komprimieren und in einem BLOB zu speichern anstelle eines TEXT . Der meiste "Text" schrumpft 3:1. Blobs werden genauso wie Texte außerhalb der Aufzeichnung gesendet, diese komprimierten Blobs sind jedoch kleiner und werden daher weniger wahrscheinlich verschüttet.
  • Führen Sie mehr Verarbeitung in SQL durch -- um zu vermeiden, dass alle Zeilen zurückgegeben werden, oder um zu vermeiden, dass der vollständige Text zurückgegeben wird usw. Wenn Sie blind viel Text an einen Client schaufeln, werden das Netzwerk und der Client zu einem wichtigen Faktor in der verstrichenen Zeit. nicht nur das SELECT , selbst.