Ci sono alcune opzioni che possono far materializzare le tabelle temporanee come tabelle MyISAM o che possono essere configurate per ritardarlo. Tenete a mente che per le tabelle temporanee basate su disco, non ci sono .frm
i file, ma solo .MYD
e .MYI
file (ovviamente. Il file .MYI non viene mai utilizzato in quanto è indice di una possibile tabella temporanea interna).
Ecco le opzioni:
Si dovrebbe anche considerare la documentazione di MySQL sull'uso della tabella delle temp interne
Le situazioni in cui vengono create le tabelle temporanee in memoria
- Se è presente una clausola ORDER BY e una diversa clausola GROUP BY o se ORDER BY o GROUP BY contiene colonne di tabelle diverse dalla prima tabella nella coda di join, viene creata una tabella temporanea.
- DISTINCT combinato con ORDER BY può richiedere una tabella temporanea.
- Se si utilizza l'opzione SQL_SMALL_RESULT, MySQL utilizza una tabella temporanea in memoria, a meno che la query non contenga anche elementi (descritti più avanti) che richiedono l'archiviazione su disco.
Quando una tabella temporanea in memoria ha superato il minimo di (tmp_table_size o max_heap_table_size), mysqld effettua le seguenti operazioni:
- Sospende la query
- Copia il contenuto della tabella in memoria in una tabella temporanea MyISAM
- Elimina la tabella in memoria
- Continua la query, inviando i dati temporanei nella tabella temporanea MyISAM
Le situazioni in cui le tabelle temporanee in memoria vengono ignorate a favore del disco lo sono
- Presenza di una colonna BLOB o TEXT nella tabella
- Presenza di qualsiasi colonna in una clausola GROUP BY o DISTINCT maggiore di 512 byte
- Presenza di qualsiasi colonna superiore a 512 byte nell'elenco SELEZIONA, se viene utilizzato UNION o UNION ALL
È necessaria una certa due diligence per ridurre la creazione della tabella temporanea sul disco
- Impostazione join_buffer_size più grande
- Impostazione di sort_buffer_size più grande
- Impostazione di tmp_table_size e max_heap_table_size più grandi
- Ottimizzazione delle query per ridurre al minimo o addirittura impedire le tabelle temporanee
- Creazione di indici per creare viste preordinate di dati da singole tabelle
- Installazione di RAM aggiuntiva per ospitare grandi tabelle temporanee in memoria
Se dopo tale due diligence, ci sono ancora delle tabelle temporanee che si formano sul disco, ecco una mossa disperata: mappare la creazione della tabella temporanea basata su disco sulla memoria.
Ecco un modo semplice e veloce per configurare un disco RAM da 16 GB usando tmpdir
STEP01) Crea cartella disco RAM
mkdir /var/mysql_tmpfs
STEP02) Aggiungi questo a my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
PASSAGGIO03) Aggiungi questo a / etc / fstab
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
STEP04) Ricarica / etc / fstab
mount -a
scritta STEP05) service mysql restart
Successivamente, tutte le tabelle temporanee che diventano MyISAM vengono scritte sul disco RAM. Ciò dovrebbe accelerare la creazione di tabelle temporanee basate su disco.
Provaci !!!
filesort
e 6405 è il PID di mysql per mantenere separati i file temporanei da diverse istanze del server.