El motor de almacenamiento MEMORY
crea tablas
con contenidos que se almacenan en memoria.Éstas se conocían
préviamente como HEAP
. En MySQL 5.0,
MEMORY
es el término preferido, aunque
HEAP
se soporta para compatibilidad con
versiones anteriores.
Cada tabla MEMORY
está asociada con un fichero
de disco. El nombre de fichero comienza con el nombre de la tabla
y tiene una exensión de .frm
para indicar
que almacena la definición de la tabla.
Para especificar explícitamente que quiere una tabla
MEMORY
, indíquelo con una opción
ENGINE
:
CREATE TABLE t (i INT) ENGINE = MEMORY;
Como indica su nombre, las tablas MEMORY
se
almacenan en memoria y usan índices hash por defecto. Esto las
hace muy rápidas, y muy útiles para crear tablas temporales. Sin
embargo, cuando se apaga el servidor, todos los datos almacenados
en las tablas MEMORY
se pierde. Las tablas por
sí mismas continúan existiendo ya que sus definiciones se
almacenan en ficheros .frm
en disco, pero
están vacías cuando reinicia el servidor.
Este ejemplo muestra cómo puede crear, usar , y borrar una tabla
MEMORY
:
mysql> CREATE TABLE test ENGINE=MEMORY -> SELECT ip,SUM(downloads) AS down -> FROM log_table GROUP BY ip; mysql> SELECT COUNT(ip),AVG(down) FROM test; mysql> DROP TABLE test;
Las tablas MEMORY
tienen las siguientes
características:
-
El espacio para tablas
MEMORY
se reserva en pequeños bloques. Las tablas usan el 100% del hashing dinámico para insrciones. No se necesita área de desbordamiento o espacio extra para claves. No se necesita espacio extra para listas libres. Los registros borrados se ponen en una lista encadenada y se reúsan cuando inserta nuevos datos en la tabla. Las tablasMEMORY
no tienen ninguno de los problemas asociados con borrados más inserciones en tablas hasheadas. -
Las tablas
MEMORY
pueden tener hasta 32 índices por tabla, 16 columnas por índice y una clave de longitud máxima de 500 bytes. -
En MySQL 5.0, el motor
MEMORY
implementa índicesHASH
yBTREE
. Puede espcificar uno u otro para cada índice añadiendo una cláusulaUSING
tal y como se muestra:CREATE TABLE lookup (id INT, INDEX USING HASH (id)) ENGINE = MEMORY; CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
Las características generales de B-trees e índices hash se describen en Sección 7.4.5, “Cómo utiliza MySQL los índices”.
-
Puede tener claves no únicas en una tabla
MEMORY
. (Esta es una característica no común de implementaciones de índices hash.) -
En MySQL 5.0, puede usar
INSERT DELAYED
con tablasMEMORY
. Consulte Sección 13.2.4.2, “Sintaxis deINSERT DELAYED
”. -
Si tiene un índice hash en una tabla
MEMORY
que tenga un alto índice de duplicación de claves (muchas entradas de índice con el mismo valor), las actualizaciones a la tabla que afecten valores claves y todos los borrados son significativamente más lentos. El rango de esta ralentización es proporcional al rango de duplicación (o inversamente proporcional al grado cardinalidad). Pude usar un índiceBTREE
para evitar este problema. -
Las tablas
MEMORY
usan una longitud de registro fija. -
MEMORY
no soporta columnasBLOB
oTEXT
. -
MEMORY
en MySQL 5.0 incluye soporte para columnasAUTO_INCREMENT
e índices en columnas que contengan valoresNULL
. -
Las tablas
MEMORY
se comparten entre todos los clientes (como cualquier otra tabla no-TEMPORARY
). -
Los contenidos de las tablas
MEMORY
se almacenan en memora , lo que es una propiedad que las tablasMEMORY
comparten con las tablas internas que el servidor va creando al procesar consultas. Sin embargo, los dos tipos de tablas difierne en que las tablasMEMORY
no están sujetas a conversión de almacenamiento, mientras que las tablas internas sí:-
Si una tabla interna llega a ser demasiado grande, el servidor la convierte automáticamente a una tabla en disco. El límite de tamaño lo determina la variable de sistema
tmp_table_size
. -
Las tablas
MEMORY
nunca se convieren en tablas de disco. Para segurar que no comete un error accidentalmente, puede cambiar la variable de sistemamax_heap_table_size
para que imponga un tamaño máximo de tablasMEMORY
. Para tablas individuales, puede especificar la opción de tablaMAX_ROWS
en el comandoCREATE TABLE
.
-
-
El servidor necesita suficiente memoria para mantener todas las tablas
MEMORY
en uso a la vez. -
Para liberar memoria usada por una tabla
MEMORY
cuando no se requiere su contenido, debe ejecutarDELETE FROM
oTRUNCATE TABLE
, o borrar toda la tabla conDROP TABLE
. -
Si quiere rellenar una tabla
MEMORY
cuando arranca el servidor MySQL, puede usar la opción--init-file
. Por ejemplo, puede usar comandos comoINSERT INTO ... SELECT
oLOAD DATA INFILE
en este fichero para cargar la tabla de una fuente de datos persistente. Consulte Sección 5.3.1, “Opciones del comando mysqld” y Sección 13.2.5, “Sintaxis deLOAD DATA INFILE
”. -
Si usa replicación, las tablas
MEMORY
del servidor maestro se vacían cuando se apaga y reinicia. Sin embargo, un esclavo no es consciente que se vacían estas tablas, así que retorna contenido desfasado si selecciona datos del mismo. En MySQL 5.0, cuando se usa una tablaMEMORY
en el maestro por primera vez desde que arrancó el maestro, se escribe un comandoDELETE FROM
en el log binario del maestro automáticamente, resincronizando el maestro y el esclavo otra vez. Tenga en cuenta que incluso con esta estrategia, el esclavo tiene datos desfasados en la tabla en el intervalo entre el reinicio del maestro y el primer uso de la tabla. Sin embargo, si usa la opción--init-file
para rellenar la tablaMEMORY
al arrancar el maestro, se asegura que este intervalo sea cero. -
La memoria necesaria por un registro en una tabla
MEMORY
se calcula con la siguiente expresión:SUM_OVER_ALL_BTREE_KEYS(
max_length_of_key
+ sizeof(char*) * 4) + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2) + ALIGN(length_of_row
+1, sizeof(char*))ALIGN()
representa un factor de redondeo para que la longitud del registro sea un múltiplo exacto del tamaño del punterochar
.sizeof(char*)
es 4 en máquinas de 32-bit y 8 en máquinas de 64-bit.