2016-04-25 17 views
4

Ich versuche, eine temporäre mySQL Tabelle in den Speicher zu erstellen und laden Sie die folgende Syntax verwendet, sondern in eine leite „Tabelle voll ist“ Fehler:mySQL temporäre Tabelle ist voll

CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE=MEMORY SELECT * FROM history ORDER BY date ASC; 

Meine ursprüngliche Geschichte InnoDB-Tabelle hat ungefähr 3m Reihen und ungefähr 300mb.

max_heap_table_size = 536870912

tmp_table_size = 536870912

ich mySQL auf AWS r3.xlarge renne, die ein 4-Kern ist: Ich habe die beiden folgenden Servervariablen von ihren 16mb Standardwerte erhöht Box mit 30,5 GB RAM.

Ich habe this SO guidance überprüft, aber läuft immer noch in die Tabelle ist voller Fehler. Ich bin neu in der Verwendung der Speicher-Engine, daher werden alle Vorschläge geschätzt.

Antwort

3

max_heap_table_size, nicht tmp_table_size steuert die maximale Größe jeder nachfolgenden Tabelle MEMORY.

MEMORY hat einige Macken. Vielleicht dieses ein bisschen Sie: VARCHARs werden in CHARs umgewandelt. Also ein VARCHAR(255) dauert 765 Bytes für jede Zeile, wenn es CHARACTER SET utf8 ist.

Warum möchten Sie eine perfekte InnoDB-Tabelle in eine MEMORY-Tabelle kopieren? Um Festplattentreffer zu vermeiden? Nein ... Wenn innodb_buffer_pool_size groß genug ist, wird die InnoDB-Tabelle effektiv im RAM leben. Um die Dinge zu beschleunigen? Nicht unbedingt, weil InnoDB Zeilensperren hat, aber MEMORY nur Tabellensperren hat.

Bitte geben Sie SHOW CREATE TABLE; Es kann andere Dinge geben, die Sie gegen das, was Sie tun, streiten und/oder erklären, warum Sie den Fehler bekommen haben.

+0

Vielen Dank für Ihren Kommentar. Ich hätte erwähnen sollen, dass meine Geschichtstabelle in Jahre unterteilt ist und diese temporäre Tabelle einen dieser Jahre für den schreibgeschützten Zugriff lädt. Ich aktualisiere diese temporäre Tabelle einmal pro Tag. Es ist mir auch peinlich, zuzugeben, dass ich versucht habe, diese Aussage von Sequel Pro auszuführen, die den Fehler zurückgegeben hat. Das Ausführen über die Befehlszeile hat die temporäre Tabelle im Speicher erfolgreich erstellt. Meine anfänglichen Tests der Abfrageantwortrate gegenüber dieser neuen temporären Speichertabelle haben eine Verbesserung von 90%. – Gunnar

+0

Wiederladen nur einmal am Tag? Geben Sie auch den Speicherplatz, den Sie MEMORY gegeben hätten, stattdessen dem buffer_pool –

1

Finden Sie heraus, was alle Tabellen, die Sie erstellt haben Engine = Speicher

select table_name, 
round(((data_length + index_length)/1024/1024), 2) `Size in MB` 
from information_schema.tables 
where table_schema = 'db1' and engine = 'memory'; 

den Befehl top verwenden, um zu sehen, welcher Prozess verbraucht, welche Menge an Speicher. Vermeiden Sie bei sehr großen Tabellen die Verwendung von Speicher. Denken Sie an einen Spaltenspeicher wie Amazon RedShift.

+0

Alle meine Tabellen sind als InnoDB aufgeführt. – Gunnar

Verwandte Themen