Certaines options peuvent entraîner la matérialisation des tables temporaires sous forme de tables MyISAM ou peuvent être configurées pour la retarder. Gardez à l' esprit que pour les tables temporaires sur disque, il n'y a pas de .frm
fichiers, mais seulement .MYD
et .MYI
fichiers (bien sûr. Le fichier .MYI jamais utilisé car il est impossible indice d' une table de température interne).
Voici les options:
Vous devriez également considérer la documentation MySQL sur l'utilisation de la table de température interne
Les situations où des tables temporaires en mémoire sont créées sont
- S'il existe une clause ORDER BY et une clause GROUP BY différente, ou si ORDER BY ou GROUP BY contient des colonnes de tables autres que la première table de la file d'attente de jointure, une table temporaire est créée.
- DISTINCT combiné avec ORDER BY peut nécessiter une table temporaire.
- Si vous utilisez l'option SQL_SMALL_RESULT, MySQL utilise une table temporaire en mémoire, sauf si la requête contient également des éléments (décrits plus loin) qui nécessitent un stockage sur disque.
Lorsqu'une table temporaire en mémoire dépasse le minimum de (tmp_table_size ou max_heap_table_size), mysqld fait ce qui suit:
- Suspend la requête
- Copie le contenu de la table en mémoire dans une table temporaire MyISAM
- Ignore la table en mémoire
- Continue la requête, en envoyant les données temporaires dans la table temporaire MyISAM
Les situations où les tables temporaires en mémoire sont contournées en faveur du disque sont
- Présence d'une colonne BLOB ou TEXT dans le tableau
- Présence d'une colonne dans une clause GROUP BY ou DISTINCT supérieure à 512 octets
- Présence de toute colonne supérieure à 512 octets dans la liste SELECT, si UNION ou UNION ALL est utilisé
Une certaine diligence est requise pour réduire la création de tables temporaires sur le disque
- Définition de join_buffer_size plus grande
- Définition de sort_buffer_size plus grande
- Définition de tmp_table_size et max_heap_table_size plus grands
- Optimisation des requêtes pour minimiser ou même empêcher les tables temporaires
- Création d'index pour créer une vue pré-triée des données à partir de tables individuelles
- Installation de RAM supplémentaire pour accueillir de grandes tables temporaires en mémoire
Si après une telle diligence, des tables temporaires sont toujours en cours de formation sur le disque, voici une décision désespérée: mapper la création de la table temporaire basée sur le disque à la mémoire.
Voici un moyen rapide et sale de configurer un disque RAM de 16 Go à l'aide de tmpdir
STEP01) Créer un dossier de disque RAM
mkdir /var/mysql_tmpfs
STEP02) Ajoutez ceci à my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
STEP03) Ajoutez ceci à / etc / fstab
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
ÉTAPE04) Recharger / etc / fstab
mount -a
STEP05) service mysql restart
Après cela, toutes les tables temporaires qui deviennent MyISAM sont écrites sur le disque RAM. Cela devrait accélérer la création de tables temporaires sur disque.
Essaie !!!
filesort
, et 6405 est le PID de mysql pour séparer les fichiers temporaires de différentes instances de serveur.