¿Cuáles son las principales diferencias entre InnoDB y MyISAM?
¿Cuáles son las principales diferencias entre InnoDB y MyISAM?
Respuestas:
La primera gran diferencia que veo es que InnoDB implementa el bloqueo de nivel de fila, mientras que MyISAM solo puede hacer un bloqueo de nivel de tabla. Encontrará una mejor recuperación de fallas en InnoDB. Sin embargo, no tiene FULLTEXT
índices de búsqueda hasta v5.6, al igual que MyISAM. InnoDB también implementa transacciones, claves foráneas y restricciones de relación, mientras que MyISAM no.
La lista puede ir un poco más allá. Sin embargo, ambos tienen sus ventajas únicas a su favor y desventajas entre sí. Cada uno de ellos es más adecuado en algunos escenarios que el otro.
Para resumir ( TL; DR ):
FULLTEXT
índices de búsqueda, InnoDB no lo hizo hasta MySQL 5.6 (febrero de 2013).version 5.6.4
InnoDB admite la FULLTEXT
búsqueda. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Otra diferencia importante que aún no se menciona es cómo se realiza el almacenamiento en caché de cada motor de almacenamiento.
El mecanismo principal utilizado es el caché de claves. Solo almacena en caché páginas de índice de archivos .MYI. Para dimensionar su caché de claves, ejecute la siguiente consulta:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
Esto le dará la Configuración recomendada para MyISAM Key Cache ( key_buffer_size ) dado su conjunto de datos actual ( la consulta limitará la recomendación a 4G (4096M). Para el sistema operativo de 32 bits, 4 GB es el límite. Para 64 bits, 8 GB.
El mecanismo principal utilizado es el InnoDB Buffer Pool. Almacena en caché los datos y las páginas de índice de las tablas de InnoDB a las que se accede. Para dimensionar su InnoDB Buffer Pool, ejecute la siguiente consulta:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
Esto le dará la Configuración recomendada para el tamaño del InnoDB Buffer Pool ( innodb_buffer_pool_size ) dado su conjunto de datos actual.
No olvide cambiar el tamaño de los archivos de registro de InnoDB (ib_logfile0 e ib_logfile1). El código fuente de MySQL coloca un límite de los tamaños combinados de todos los archivos de registro de InnoDB deben ser <4G (4096M). En aras de la simplicidad, dados solo dos archivos de registro, así es como puede dimensionarlos:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 e ib_logfile1 se recrean)Al final de ambas consultas hay una consulta en línea
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
da la configuración en bytes(SELECT 1 PowerOf1024)
da la configuración en kilobytes(SELECT 2 PowerOf1024)
da la configuración en megabytes(SELECT 3 PowerOf1024)
da la configuración en gigabytesNo hay sustituto para el sentido común. Si tiene memoria limitada, una combinación de motores de almacenamiento o una combinación de ambos, tendrá que adaptarse a diferentes escenarios.
¡Los escenarios posibles son infinitos!
Recuerde, lo que sea que asigne, deje suficiente RAM para las conexiones DB y el sistema operativo.
InnoDB ofrece:
En InnoDB, todos los datos en una fila, excepto TEXT y BLOB, pueden ocupar 8,000 bytes como máximo. La indexación de texto completo no está disponible en InnoDB hasta MySQL 5.6 (febrero de 2013). En InnoDB, los COUNT(*)
s (cuando WHERE
, GROUP BY
o JOIN
no se usan) se ejecutan más lentamente que en MyISAM porque el recuento de filas no se almacena internamente. InnoDB almacena datos e índices en un archivo. InnoDB utiliza una agrupación de almacenamiento intermedio para almacenar en caché tanto los datos como los índices.
MyISAM ofrece:
COUNT(*)
s (cuando WHERE
, GROUP BY
o JOIN
no se utiliza)MyISAM tiene bloqueo a nivel de tabla, pero no bloqueo a nivel de fila. No hay transacciones No hay recuperación automática de fallos, pero ofrece la funcionalidad de la tabla de reparación. Sin restricciones de clave externa. Las tablas MyISAM son generalmente de tamaño más compacto en el disco en comparación con las tablas InnoDB. Las tablas MyISAM podrían reducirse aún más en tamaño si se comprimen con myisampack si fuera necesario, pero se convertirían en solo lectura. MyISAM almacena índices en un archivo y datos en otro. MyISAM utiliza buffers clave para almacenar en caché los índices y deja la gestión de almacenamiento en caché de datos al sistema operativo.
En general, recomendaría InnoDB para la mayoría de los propósitos y MyISAM solo para usos especializados. InnoDB es ahora el motor predeterminado en las nuevas versiones de MySQL.
Una cosa más: puede hacer una copia de seguridad de las tablas de InnoDB simplemente tomando una instantánea del sistema de archivos. Hacer una copia de seguridad de MyISAM requiere el uso de mysqldump y no se garantiza que sea coherente (por ejemplo, si inserta en una tabla primaria y una tabla secundaria, es posible que solo encuentre la fila de la tabla secundaria en su copia de seguridad).
Básicamente, si tiene otra copia de los datos y solo los está almacenando en caché en MySQL, por ejemplo, para permitir un medio estándar de acceso desde un sitio web de PHP, entonces MyISAM está bien (es decir, es mejor que un archivo CSV plano o un archivo de registro para consultas y acceso concurrente). Si la base de datos es la "copia maestra" real de los datos, si está haciendo INSERT
y UPDATE
usando datos reales de los usuarios, entonces es una tontería usar algo que no sea InnoDB, en cualquier escala MyISAM no es confiable y difícil de administrar, usted Lo haré la myisamchk
mitad del tiempo, negando cualquier aumento de rendimiento ...
(Mi experiencia personal: un DB de 2 terabytes en MyISAM).
Un poco tarde para el juego ... pero aquí hay una publicación bastante completa que escribí hace unos meses , que detalla las principales diferencias entre MYISAM e InnoDB. Agarra una cuppa (y tal vez una galleta) y disfruta.
La principal diferencia entre MyISAM e InnoDB está en la integridad referencial y las transacciones. También hay otra diferencia, como bloqueo, reversiones y búsquedas de texto completo.
La integridad referencial asegura que las relaciones entre las tablas se mantengan consistentes. Más específicamente, esto significa que cuando una tabla (por ejemplo, Listados) tiene una clave externa (por ejemplo, ID de producto) que apunta a una tabla diferente (por ejemplo, Productos), cuando se producen actualizaciones o eliminaciones en la tabla señalada, estos cambios se conectan en cascada al enlace mesa. En nuestro ejemplo, si se cambia el nombre de un producto, las claves externas de la tabla de enlace también se actualizarán; Si un producto se elimina de la tabla 'Productos', también se eliminará cualquier listado que apunte a la entrada eliminada. Además, cualquier listado nuevo debe tener esa clave externa que apunte a una entrada válida y existente.
InnoDB es un DBMS relacional (RDBMS) y, por lo tanto, tiene integridad referencial, mientras que MyISAM no.
Los datos en una tabla se administran utilizando instrucciones del lenguaje de manipulación de datos (DML), como SELECT, INSERT, UPDATE y DELETE. Una transacción agrupa dos o más sentencias DML en una sola unidad de trabajo, por lo que se aplica la unidad completa o no se aplica nada.
MyISAM no admite transacciones, mientras que InnoDB sí.
Si se interrumpe una operación mientras se usa una tabla MyISAM, la operación se interrumpe inmediatamente y las filas (o incluso los datos dentro de cada fila) que se ven afectados permanecen afectados, incluso si la operación no se completó.
Si se interrumpe una operación mientras se usa una tabla InnoDB, debido a que usa transacciones, que tienen atomicidad, cualquier transacción que no se completó no tendrá efecto, ya que no se realiza ninguna confirmación.
Cuando se ejecuta una consulta en una tabla MyISAM, se bloqueará toda la tabla en la que se está consultando. Esto significa que las consultas posteriores solo se ejecutarán una vez que finalice la actual. Si está leyendo una tabla grande, y / o hay operaciones frecuentes de lectura y escritura, esto puede significar una gran acumulación de consultas.
Cuando una consulta se ejecuta contra una tabla InnoDB, solo las filas involucradas están bloqueadas, el resto de la tabla permanece disponible para operaciones CRUD. Esto significa que las consultas pueden ejecutarse simultáneamente en la misma tabla, siempre que no utilicen la misma fila.
Esta característica en InnoDB se conoce como concurrencia. Por grande que sea la concurrencia, hay un inconveniente importante que se aplica a un rango selecto de tablas, ya que hay una sobrecarga al cambiar entre hilos del kernel, y debe establecer un límite en los hilos del kernel para evitar que el servidor se detenga .
Cuando ejecuta una operación en MyISAM, se establecen los cambios; en InnoDB, esos cambios pueden revertirse. Los comandos más comunes utilizados para controlar las transacciones son COMMIT, ROLLBACK y SAVEPOINT. 1. COMMIT: puede escribir varias operaciones DML, pero los cambios solo se guardarán cuando se realice un COMMIT 2. ROLLBACK: puede descartar cualquier operación que aún no se haya confirmado 3. SAVEPOINT: establece un punto en la lista de operaciones a las que una operación ROLLBACK puede revertir a
MyISAM no ofrece integridad de datos: las fallas de hardware, los cierres sucios y las operaciones canceladas pueden provocar que los datos se corrompan. Esto requeriría una reparación completa o reconstrucciones de los índices y las tablas.
InnoDB, por otro lado, utiliza un registro de transacciones, un búfer de doble escritura y una suma de verificación y validación automática para evitar la corrupción. Antes de que InnoDB realice cambios, registra los datos antes de las transacciones en un archivo de espacio de tabla del sistema llamado ibdata1. Si hay un bloqueo, InnoDB se recuperaría automáticamente mediante la reproducción de esos registros.
InnoDB no admite la indexación FULLTEXT hasta MySQL versión 5.6.4. Al momento de escribir esta publicación, la versión MySQL de muchos proveedores de alojamiento compartido todavía está por debajo de 5.6.4, lo que significa que la indexación FULLTEXT no es compatible con las tablas InnoDB.
Sin embargo, esta no es una razón válida para usar MyISAM. Es mejor cambiar a un proveedor de alojamiento que admita versiones actualizadas de MySQL. No es que una tabla MyISAM que usa la indexación FULLTEXT no pueda convertirse en una tabla InnoDB.
En conclusión, InnoDB debería ser su motor de almacenamiento predeterminado preferido. Elija MyISAM u otros tipos de datos cuando satisfagan una necesidad específica.
En mi experiencia, la diferencia más significativa es la forma en que cada motor maneja el bloqueo. InnoDB usa el bloqueo de fila mientras que MyISAM usa el bloqueo de tabla. Como regla general, uso InnoDB para escribir tablas pesadas y MyISAM para leer tablas pesadas.
Otras diferencias importantes incluyen:
FULLTEXT
y SPATIAL
. InnoDB es bueno tanto para cargas pesadas de lectura como de escritura.
Tiendo a ver MyISAM como la opción de tabla 'predeterminada' para MySQL, así que señalaré las diferencias para la mayoría de los usuarios de InnoDB
MYISAM
MYISAM proporciona bloqueo de nivel de tabla, búsqueda FULLTEXT. MYISAM tiene el manejo de columnas AUTO_INCREMENTADO más flexible de todos los motores de almacenamiento. MYISAM no admite transacciones.
INNODB
INNODB es un motor de almacenamiento seguro para transacciones. INNODB tiene capacidades de confirmación, reversión y recuperación de fallos. INNODB admite integridad referencial de clave externa.
Incluye cambios de MySQL 5.6
MOTOR DE ALMACENAMIENTO INNODB:
Por lo tanto, no tiene sentido usar MyISAM
Engine si ya está actualizado a 5.6, de lo contrario, no espere la actualización a MySQL 5.6.
MyISAM es un motor de almacenamiento para MySQL. Antes de MySQL 5.5, era el motor de almacenamiento predeterminado para MySQL. Se basa en el antiguo motor de almacenamiento ISAM. MyISAM está optimizado para entornos con operaciones de lectura intensas y pocas escrituras, o ninguna. La razón por la que MyISAM permite lecturas rápidas es la estructura de sus índices: cada entrada apunta a un registro en el archivo de datos, y el puntero está desplazado desde el comienzo del archivo. De esta forma, los registros se pueden leer rápidamente, especialmente cuando el formato es FIJO. Por lo tanto, las filas son de longitud constante. Un área típica en la que uno podría preferir MyISAM es el almacén de datos, porque involucra consultas en tablas muy grandes, y la actualización de dichas tablas se realiza cuando la base de datos no está en uso (generalmente de noche). Las inserciones también son fáciles, porque se agregan nuevas filas al final del archivo de datos. Sin embargo, las operaciones de eliminación y actualización son más problemáticas: las eliminaciones deben dejar un espacio vacío, o los desplazamientos de las filas cambiarían; lo mismo ocurre con las actualizaciones, ya que la longitud de las filas se acorta; Si la actualización hace que la fila sea más larga, la fila está fragmentada. Para desfragmentar filas y reclamar espacio vacío, elOPTIMIZE TABLE
El comando debe ser ejecutado. Debido a este mecanismo simple, generalmente las estadísticas del índice MyISAM son bastante precisas. Otros inconvenientes importantes de MyISAM son la ausencia de soporte de transacciones y claves foráneas.
InnoDB es un motor de almacenamiento para MySQL. MySQL 5.5 y posterior lo usan por defecto. Proporciona las características de transacción estándar que cumplen con ACID, junto con el soporte de clave externa (integridad referencial declarativa). Implementa transacciones, espacios de tabla, FULLTEXT
índices y operaciones espaciales SQL y XA siguiendo el estándar OpenGIS. Se incluye como estándar en la mayoría de los binarios distribuidos por MySQL AB, con la excepción de algunas versiones OEM. El software tiene doble licencia de Oracle Corporation; se distribuye bajo la Licencia Pública General de GNU, pero también se puede licenciar a las partes que deseen combinar InnoDB en un software propietario.
MariaDB tiene un motor de almacenamiento llamado Aria, que se describe como una "alternativa segura a los choques de MyISAM". MariaDB y Percona Server usan una bifurcación de InnoDB llamada XtraDB por defecto. XtraDB es mantenido por Percona. Los cambios de Oracle InnoDB se importan regularmente en XtraDB, y se agregan algunas correcciones de errores y características adicionales.