2011-09-26 15 views

Respuesta

23

Depende del motor que especifique. Por defecto, los datos de la tabla se almacenarán en el disco. Si especifica el motor MEMORY, los datos solo se almacenarán en la memoria.

Debería ser posible encontrar realmente los archivos que se crean en el sistema de archivos cuando se crean las tablas temporales. Después de ejecutar los siguientes comandos:

CREATE TABLE test.table_myisam (x int) ENGINE=MyISAM; 
CREATE TABLE test.table_memory (x int) ENGINE=MEMORY; 
CREATE TEMPORARY TABLE test.temp_table_myisam (x int) ENGINE=MyISAM; 
CREATE TEMPORARY TABLE test.temp_table_memory (x int) ENGINE=MEMORY; 

que después se comprueba el directorio: C: \ Datos de programa \ MySQL \ MySQL Server 5.5 \ data \ test (en Windows) y los archivos presentes fueron:

 
table_innodb.frm # Table definition. 
table_innodb.MYD # MyISAM table data file. 
table_innodb.MYI # MyISAM table index file. 

table_memory.frm # No MYD or MYI file for the MEMORY engine. 

Las tablas temporales se almacenan en C: \ Windows \ Temp y tienen nombres inusuales, pero internamente los datos se almacenan de la misma manera.

 
#sql9a0_7_d.frm # This is the MyISAM temporary table. 
#sql9a0_7_d.MYD # MyISAM data file for temporary table. 
#sql9a0_7_d.MYI # MyISAM index file for temporary table. 

#sql9a0_7_c.frm # This is the MEMORY engine file. No MYD or MYI. 
+4

Y si especifica el motor 'blackhole' se almacenará en un dispositivo especial:/dev/null. – Johan

+2

Bueno, no se llamarán 'temp_table_innodb' en el disco porque la tabla temporal solo es accesible por esta conexión, de modo que si realiza dos conexiones separadas al DB y crea una tabla temporal con cada una, puede llamarlas lo mismo y no colisionarán entre sí. Dicho todo esto, no tengo idea si están en la memoria o en el disco. Supongo, pero sin duda adivinaría mal, así que no lo haré. – Kenny

+0

@Kenny: los encontré ... en la carpeta temporal (¡por supuesto!). Ver respuesta actualizada. –

4

Como dijo Mark, depende de qué motor le diga que use. Si no le das un MOTOR, hará "algo", pero no necesariamente lo mantendrá solo en la memoria. Si desea forzar la mesa para estar en la memoria, usted tiene que definir explícitamente:

CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY; 

Sin embargo, el uso de la memoria-motor está restringido. Para obtener más información, echa un vistazo a http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html.

+2

Tenga en cuenta que (al menos en MySQL 5.1.63) las tablas temporales de memoria creadas por el usuario están limitadas por max_heap_table_size y, a diferencia de las tablas temporales internas, NO se convertirán en tablas temporales en disco si/crecen demasiado grandes Insertar más datos dará como resultado un error. –

+2

El enlace de arriba es para la tabla interna temporal (generada para ejecutar alguna consulta sql) no para la tabla temporal explícita. –

Cuestiones relacionadas