Hay algunas opciones que pueden hacer que las tablas temporales se materialicen como tablas MyISAM o pueden configurarse para retrasarlo. Tenga en cuenta que para las tablas temporales basados en disco, no hay .frm
archivos, pero sólo .MYD
y .MYI
archivos (por supuesto. .MYI el archivo no se usa nunca, ya que es imposible índice de una tabla de temperatura interna).
Aquí están las opciones:
También debe considerar la documentación de MySQL sobre el uso interno de la tabla temporal
Las situaciones en las que se hacen tablas temporales en memoria son
- Si hay una cláusula ORDER BY y una cláusula GROUP BY diferente, o si ORDER BY o GROUP BY contiene columnas de tablas distintas de la primera tabla en la cola de unión, se crea una tabla temporal.
- DISTINCT combinado con ORDER BY puede requerir una tabla temporal.
- Si usa la opción SQL_SMALL_RESULT, MySQL usa una tabla temporal en memoria, a menos que la consulta también contenga elementos (descritos más adelante) que requieren almacenamiento en disco.
Cuando una tabla temporal en memoria excedió el mínimo de (tmp_table_size o max_heap_table_size), mysqld hace lo siguiente:
- Suspende la consulta.
- Copia el contenido de la tabla en memoria en una tabla temporal MyISAM
- Descarta la tabla en memoria
- Continúa la consulta, enviando los datos temporales a la tabla temporal MyISAM
Las situaciones en las que las tablas temporales en memoria se omiten en favor del disco son
- Presencia de una columna BLOB o TEXT en la tabla
- Presencia de cualquier columna en una cláusula GROUP BY o DISTINCT de más de 512 bytes
- Presencia de cualquier columna de más de 512 bytes en la lista SELECT, si se utiliza UNION o UNION ALL
Se requiere cierta diligencia debida para reducir la creación de la tabla temporal en el disco
- Configuración de join_buffer_size más grande
- Establecer sort_buffer_size más grande
- Establecer tmp_table_size y max_heap_table_size más grande
- Ajuste de consultas para minimizar o incluso prevenir tablas temporales
- Crear índices para crear una vista preestablecida de datos de tablas individuales
- Instalación de RAM adicional para acomodar grandes tablas temporales en memoria
Si después de dicha diligencia debida, todavía se están formando tablas temporales en el Disco, aquí hay un movimiento desesperado: Mapear la creación de la tabla temporal basada en disco a la memoria.
Aquí hay una manera rápida y sucia de configurar un disco RAM de 16GB usando tmpdir
PASO01) Crear carpeta de disco RAM
mkdir /var/mysql_tmpfs
STEP02) Añadir esto a my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
PASO03) Agregue esto a / etc / fstab
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
PASO04) Recargar / etc / fstab
mount -a
PASO05) service mysql restart
Después de esto, todas las tablas temporales que se convierten en MyISAM se escriben en el disco RAM. Esto debería acelerar la creación de la tabla temporal basada en disco.
Darle una oportunidad !!!
filesort
, y 6405 es el PID de mysql para mantener separados los archivos temporales de diferentes instancias de servidor.