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

Speicherort der temporären MySQL-Tabelle

MySQL verwendet einen Trick, der seit jeher Teil von POSIX-Systemen ist. Es öffnet die temporäre Datei und hebt die Verknüpfung sofort auf. Daher ist es in keinem Verzeichniseintrag sichtbar. Aber POSIX-Systeme wie UNIX und Linux sollten eine nicht verknüpfte Datei nicht wirklich entfernen, während ein Prozess ein offenes Datei-Handle dafür hat. Sobald die Abfrage mit der temporären Tabelle beendet ist, wird das Datei-Handle geschlossen, und das Betriebssystem entfernt die Datei automatisch und gibt den verwendeten Speicher frei.

Dies ist im Allgemeinen besser, als den Servercode zu erfordern. Denken Sie daran, die Tempdatei zu entfernen, wenn sie damit fertig ist. Es erklärt auch, wie der Thread beendet wird oder mysqld abstürzt. Zumindest hinterlässt es keine veralteten temporären Dateien, die Ihr Dateisystem verunreinigen.

Sie können die Größe nicht verknüpfter Dateien mit lsof -s anzeigen . Ich überlasse es Ihnen, nach Beispielen für die Verwendung dieses Befehls zu suchen (Google ist hier Ihr Freund).

Es ist kaum möglich, dass eine temporäre Datei Ihre 167 GB freien Speicherplatz belegt.

Oder es könnte sein, dass die temporäre Datei nur 8 GB verwendet, aber möglicherweise 20 Threads gleichzeitig dieselbe Abfrage ausführen. Ich habe das einmal erlebt.

Aber es ist wahrscheinlicher, dass Sie einen Wert von tmp_table_size haben das schränkt die Größe der temporären Tabelle ein.

Wenn Sie das Limit erreichen, können Sie diese Konfigurationsoption entweder als Sitzungsvariable bei Bedarf oder global in my.cnf erhöhen .

Aber ich würde zuerst versuchen, die Abfrage zu optimieren. Warum muss es so große temporäre Tabellen erstellen? Könnte es optimiert werden, um weniger Zeilen zu untersuchen, oder vielleicht ganz auf die Erstellung einer temporären Tabelle verzichten?