MOTORES DE ALMACENAMIENTO en MySQL

* El servidor MySQL incorpora una característica única llamada «motores de almacenamiento», que nos permite seleccionar el tipo de almacenamiento interno de cada tabla, en base al que mejor se adecúe a una situación particular. Dicha selección, la hace el desarrollador a nivel de tabla, y no afecta a la manera en que el servidor interactúa con el cliente: los comandos SQL serán los mismos sea cual sea el motor de almacenamiento escogido. El cliente no necesita saber como se guardan los datos. MySQL dispone de una docena de motores de almacenamiento propios, más los motores externos desarrollados por terceras partes que se pueden incorporar al servidor. Algunos de los más conocidos son: MyISAM, InnoDB, HEAP, NDB.
* Seleccionar el motor de almacenamiento de una tabla:
CREATE TABLE nombre_tabla (definición) ENGINE = nombre_motor;
ALTER TABLE nombre_tabla ENGINE = nombre_motor;

Ejemplos:
CREATE TABLE City (…) ENGINE=InnoDB;
ALTER TABLE City ENGINE=MyISAM;

* Caractrísticas del motor MyISAM:
– No transaccional.
– Bloqueos a nivel de tabla.
– Muy rápido en lectura y escritura (excepto escrituras simultaneas en la
misma tabla).
– Bajo requerimiento de espacio en disco y memoria.
– Los datos se guardan en disco: diferentes ficheros para la definición de la
tabla, los datos y los índices.
– Es el motor por defecto de MySQL.
– Es una buena elección cuando necesitamos velocidad, y tenemos pocas
modificaciones simultaneas de la tabla.

* Caractrísticas del motor InnoDB:
– Transaccional.
– Multiversionado: cuando múltiples transacciones modifican registros, InnoDB
mantiene aisladas las transacciones guardando para cada una de ellas
un versión distinta de un mismo registro, a cada transacción la versión que
le corresponde.
– Bloqueos a nivel de registro.
– Restricciones en claves foráneas.
– Fácil recuperación de datos en caso de error.
– Alta concurrencia más segura en escritura.
– Deshacer transacciones a medias («rollback»).
– Los datos se guardan en disco: un fichero para la definición de la
tabla, y un «tablespace» para guardar conjuntamente datos e índices. El
tablespace puede consistir en uno o más ficheros, o incluso una partición
entera en disco.
– Podemos especificar como crecen los tablespaces en el fichero de
configuracion /etc/mysql/my.cnf. Por ejemplo:
[mysqld]
innodb_data_file_path = ibdata1:100M;ibdata2:100M:autoextend:max:500M
– Necesita mas espacio en disco y memoria que MyISAM para guardar los datos
(unas tres veces mas de espacio en disco, y montones de RAM para las
memorias temporales si queremos conseguir un rendimiento óptimo).
– Es una buena elección cuando necesitamos transacciones, restricciones en
claves foráneas, o tenemos muchas escrituras simultaneas.

* Caractrísticas del motor HEAP:
– Los datos se guardan en memoria, utilizando algoritmos que hacen un uso
óptimo de este medio.
– Es muy, muy rápido.
– Podemos crear una tabla HEAP a partir de una tabla en disco con:
CREATE TABLE nombre_tabla ENGINE=MEMORY SELECT * FROM nombre_tabla_disco;
– Es una buena elección cuando necesitamos realizar operaciones muy rápidas
sobre conjuntos pequeños de datos.

* Caractrísticas del motor NDB:
– Es el motor de almacenamiento de los clúster de MySQL.
– La base de datos esta repartida por los diferentes nodos del clúster.
– Proporciona alta disponibilidad mediante redundancia.
– Proporciona alto rendimiento mediante fragmentación de datos sobre los
grupos de nodos.
– Proporciona alta escalabilidad mediante la combinación de las dos
características anteriores.
– Los datos se guardan en memoria, pero los logs van a disco.
– Es una buena elección cuando disponiendo de varios servidores necesitamos a
la vez velocidad, transacciones y redundancia de datos; replicación
síncrona; y resistencia a caídas de servidores.

* Comparación de los motores:
MyISAM InnoDB HEAP NDB
Multi-statement transactions, ROLLBACK – X – X
Foreign key constraints – X – –
Locking level table row table row
BTREE indexes X X – X
FULLTEXT indexes X – – –
HASH lookups – X X X
Other in-memory tree-based index – – 4.1.0 –
GIS, RTREE indexes 4.1.0 – – –
Unicode 4.1.0 4.1.2 – –
Merge (union views) X – – –
Compress read-only storage X – – –
Relative disk use low high – low
Relative memory use low high low high

* Podemos deshabilitar los motores de almacenamiento que no necesitamos para
ahorrar memoria del servidor, ya que no necesitaremos reservar memoria para
los buffers y otras estructuras de datos asociadas con el motor. Por ejemplo:

shell> mysqld –skip-bdb –skip-innodb

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/storage-engines.html
– http://dev.mysql.com/doc/refman/5.0/es/myisam-storage-engine.html
– http://dev.mysql.com/doc/refman/5.0/es/innodb.html