Es gibt einige Optionen, die dazu führen können, dass temporäre Tabellen als MyISAM-Tabellen angezeigt werden oder so konfiguriert werden können, dass sie verzögert werden. Beachten Sie, dass es für festplattenbasierte temporäre Tabellen keine .frm
Dateien gibt, sondern nur Dateien .MYD
und .MYI
Dateien (natürlich wird die .MYI-Datei nie verwendet, da es unmöglich ist, eine interne temporäre Tabelle zu indizieren).
Hier sind die Optionen:
Sie sollten auch die MySQL-Dokumentation zur Verwendung interner temporärer Tabellen berücksichtigen
Die Situationen, in denen speicherinterne temporäre Tabellen erstellt werden, sind:
- Wenn es eine ORDER BY-Klausel und eine andere GROUP BY-Klausel gibt oder wenn ORDER BY oder GROUP BY Spalten aus anderen Tabellen als der ersten Tabelle in der Join-Warteschlange enthält, wird eine temporäre Tabelle erstellt.
- DISTINCT in Kombination mit ORDER BY erfordert möglicherweise eine temporäre Tabelle.
- Wenn Sie die Option SQL_SMALL_RESULT verwenden, verwendet MySQL eine temporäre In-Memory-Tabelle, es sei denn, die Abfrage enthält auch Elemente (später beschrieben), die Speicher auf der Festplatte erfordern.
Wenn eine speicherinterne temporäre Tabelle das Minimum von (tmp_table_size oder max_heap_table_size) überschreitet, führt mysqld Folgendes aus:
- Hält die Abfrage an
- Kopiert den Inhalt der In-Memory-Tabelle in eine MyISAM-temporäre Tabelle
- Verwirft die In-Memory-Tabelle
- Setzt die Abfrage fort und sendet die temporären Daten an die temporäre MyISAM-Tabelle
Die Situationen, in denen speicherinterne temporäre Tabellen zugunsten der Festplatte umgangen werden, sind:
- Vorhandensein einer BLOB- oder TEXT-Spalte in der Tabelle
- Vorhandensein einer Spalte in einer GROUP BY- oder DISTINCT-Klausel, die größer als 512 Byte ist
- Vorhandensein einer Spalte mit mehr als 512 Byte in der SELECT-Liste, wenn UNION oder UNION ALL verwendet wird
Es ist eine gewisse Sorgfalt erforderlich, um die Erstellung temporärer Tabellen auf der Festplatte zu reduzieren
- Setzen Sie join_buffer_size größer
- Setze sort_buffer_size größer
- Setzen Sie tmp_table_size und max_heap_table_size größer
- Optimieren von Abfragen, um temporäre Tabellen zu minimieren oder sogar zu verhindern
- Erstellen von Indizes zum Erstellen einer vorsortierten Ansicht von Daten aus einzelnen Tabellen
- Installieren von zusätzlichem RAM für große temporäre In-Memory-Tabellen
Wenn nach einer solchen Due Diligence noch temporäre Tabellen auf der Festplatte erstellt werden, ist hier ein verzweifelter Schritt: Zuordnen der festplattenbasierten temporären Tabellenerstellung zum Speicher.
Hier ist eine schnelle und schmutzige Möglichkeit, eine 16-GB-RAM-Disk mit tmpdir einzurichten
SCHRITT01) RAM-Disk-Ordner erstellen
mkdir /var/mysql_tmpfs
SCHRITT02) Fügen Sie dies hinzu my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
SCHRITT03) Fügen Sie dies zu / etc / fstab hinzu
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
SCHRITT 04) Laden Sie / etc / fstab neu
mount -a
SCHRITT 05) service mysql restart
Danach werden alle temporären Tabellen, die zu MyISAM werden, auf die RAM-Disk geschrieben. Dies sollte die Erstellung einer festplattenbasierten temporären Tabelle beschleunigen.
Versuche es !!!
filesort
, und 6405 ist die PID von MySQL, um temporäre Dateien von verschiedenen Serverinstanzen getrennt zu halten.