Wie viel Speicher belegt eine MEMORY-Tabelle?

7

Angenommen, ich habe eine MyISAM-Tabelle mit einer Datenlänge von 4,8 GB und einer Indexlänge von 6,2 GB. Also eine Gesamtdatengröße von elf Gig. Wie viel Speicher würde dies erfordern, wenn ich ihn in eine MEMORYTabelle konvertieren würde ? 11 Gig oder mehr?

Andrew
quelle
Beachten Sie, dass MEMORY-Tabellen temporärer Natur sind und alle Daten beim Herunterfahren des Servers verloren gehen. Wenn Sie eine Tabelle haben, die so groß wird, werden die Daten vermutlich nicht vorübergehend sein.
DB2
Tatsächlich ist es so - es zieht Daten aus einem Dutzend Tabellen zusammen, sodass andere Tabellen (die sich nicht im Speicher befinden) konsolidierte Daten daraus abrufen können. Es ist temporär, wird einmal pro Woche erstellt und sobald diese Tabellen ihre Daten erhalten, kann es verschwinden.
Andrew
Gotcha, also eine Art temporäre materialisierte Ansicht. Nur um sicher zu gehen.
DB2
Kein Problem. :) Es war ein berechtigtes Anliegen, und ich hatte erwartet, dass jemand es schafft, also war es meine Schuld, dass ich die Frage von Anfang an gestellt habe.
Andrew
Können Sie die SHOW CREATE TABLEAusgabe in Ihrer Frage posten ?
Derek Downey

Antworten:

7

Der genaue Speicherbedarf einer Zeile wird nach folgender Formel berechnet:

SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) × 4)
+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) × 2)
+ ALIGN(length_of_row+1, sizeof(char*)) 

[src]

ALIGN () stellt einen Aufrundungsfaktor dar, der bewirkt, dass die Zeilenlänge ein genaues Vielfaches der Zeichenzeigergröße ist. sizeof (char *) beträgt 4 auf 32-Bit-Computern und 8 auf 64-Bit-Computern.

Ersetzen Sie also auf einem 64-Bit-Computer durch sizeof(char*)8.

Sie können eine Schätzung der length_of_rowaus dem Informationsschema erhalten:

SELECT TABLE_ROWS, AVG_ROW_LENGTH FROM information_schema.tables WHERE  table_schema='foo' AND table_name='bar';

Dann addieren Sie alle Ihre BTREE-Schlüssel und dann die HASH-Schlüssel. Beachten Sie, dass es sich aus Platzgründen möglicherweise lohnt, Schlüssel in HASH zu konvertieren, da sie weniger Speicher benötigen.

Ich wollte die Begrenzung der maximalen Speichergröße erwähnen, die davon abhängt max_heap_table_size, aber gbn hat mich geschlagen.

Derek Downey
quelle
1
nette Antwort vor allem auf die Indizes (+1 !!!). Hey Andrew, hier ist ein Hinweis für Sie: Wenn Ihre Abfragen eine Bereichssuche durchführen, halten Sie sich von HASH-Indizes fern und verwenden Sie nur BTREEs. Wenn Ihre Abfragen eine Indexsuche durchführen (eq_ref), umgekehrt.
RolandoMySQLDBA
4

@gbn und @DTest lieferten bereits hervorragende Antworten zur Verwendung von MEMORY-Tabellen in Bezug auf Indizes und Größenbeschränkungen.

Hier ist noch eine andere Perspektive zu beachten:

Die MEMORY-Speicher-Engine

  • Verwendet die vollständige Tabellensperre für INSERTs, UPDATEs und DELETEs
  • Es können keine gleichzeitigen INSERTs ausgeführt werden
  • Verwendet standardmäßig die Hash-Indizes anstelle der BTREE-Indizes
  • kann BTREEs-Indizes verwenden, muss jedoch zum Zeitpunkt CREATE TABLE explizit angegeben werden
  • hat keine Transaktionsunterstützung
  • Einzeilige Abfragen eignen sich hervorragend für MEMORY-Tabellen, insbesondere bei Verwendung von HASH-Indizes
  • Fernabfragen und sequentieller Zugriff sind nur schrecklich, wenn Sie BTREE explizit verwenden (mehr Speicherverbrauch erforderlich).

Obwohl Sie Daten im RAM haben, schlägt mysqld immer auf die .frm-Datei zu, um nach der als Referenzpunkt vorhandenen Tabelle zu suchen, wodurch immer eine kleine Festplatten-E / A entsteht. Proportional führt ein starker Zugriff auf eine MEMORY-Speicher-Engine-Tabelle zu spürbaren Festplatten-E / A.

Sie müssen auch daran denken, ein ausgewogenes Verhältnis zwischen der Verwendung von MEMORY-Tabellen und zu finden

  • Datenbank-Caches
    • MyISAM-Schlüsselcache
    • InnoDB Buffer Pool)
  • Betriebssystem-Caches
  • Betriebssystembetrieb
RolandoMySQLDBA
quelle
3

Es kann keine MEMORY- Tabelle sein (selektives Anführungszeichen unten), wenn sie "max_heap_table_size" überschreitet . Dies sind maximal 4 GB für 32 Bit

Die maximale Größe von MEMORY-Tabellen wird durch die Systemvariable max_heap_table_size begrenzt, die einen Standardwert von 16 MB hat. Ändern Sie den Wert dieser Variablen, um unterschiedliche Größenbeschränkungen für MEMORY-Tabellen zu erzwingen

Sie können dies pro Tabelle festlegen, indem Sie max_heap_table_size pro Sitzung festlegen.

Aber 12 GB oder so sind viel Speicher für eine Caching-Tabelle ...

gbn
quelle
1
Hey, gute Antwort zur Größenbeschränkung der MEMORY-Tabelle. +1 !!!
RolandoMySQLDBA
1
Ich denke, Sie meinen, das maximal mögliche max_heap_table_size ist 4 GB für 32-Bit (und 16 Exabyte für 64-Bit).
Matthew Flaschen