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
MEMORYse 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 tablasMEMORYno tienen ninguno de los problemas asociados con borrados más inserciones en tablas hasheadas. -
Las tablas
MEMORYpueden 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
MEMORYimplementa índicesHASHyBTREE. Puede espcificar uno u otro para cada índice añadiendo una cláusulaUSINGtal 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 DELAYEDcon tablasMEMORY. Consulte Sección 13.2.4.2, “Sintaxis deINSERT DELAYED”. -
Si tiene un índice hash en una tabla
MEMORYque 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 índiceBTREEpara evitar este problema. -
Las tablas
MEMORYusan una longitud de registro fija. -
MEMORYno soporta columnasBLOBoTEXT. -
MEMORYen MySQL 5.0 incluye soporte para columnasAUTO_INCREMENTe índices en columnas que contengan valoresNULL. -
Las tablas
MEMORYse comparten entre todos los clientes (como cualquier otra tabla no-TEMPORARY). -
Los contenidos de las tablas
MEMORYse almacenan en memora , lo que es una propiedad que las tablasMEMORYcomparten con las tablas internas que el servidor va creando al procesar consultas. Sin embargo, los dos tipos de tablas difierne en que las tablasMEMORYno 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
MEMORYnunca se convieren en tablas de disco. Para segurar que no comete un error accidentalmente, puede cambiar la variable de sistemamax_heap_table_sizepara que imponga un tamaño máximo de tablasMEMORY. Para tablas individuales, puede especificar la opción de tablaMAX_ROWSen el comandoCREATE TABLE.
-
-
El servidor necesita suficiente memoria para mantener todas las tablas
MEMORYen uso a la vez. -
Para liberar memoria usada por una tabla
MEMORYcuando no se requiere su contenido, debe ejecutarDELETE FROMoTRUNCATE TABLE, o borrar toda la tabla conDROP TABLE. -
Si quiere rellenar una tabla
MEMORYcuando arranca el servidor MySQL, puede usar la opción--init-file. Por ejemplo, puede usar comandos comoINSERT INTO ... SELECToLOAD DATA INFILEen 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
MEMORYdel 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 tablaMEMORYen el maestro por primera vez desde que arrancó el maestro, se escribe un comandoDELETE FROMen 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-filepara rellenar la tablaMEMORYal arrancar el maestro, se asegura que este intervalo sea cero. -
La memoria necesaria por un registro en una tabla
MEMORYse 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.