¿Cuáles son las principales diferencias entre InnoDB y MyISAM?


245

¿Cuáles son las principales diferencias entre InnoDB y MyISAM?


23
Si desea un motor de base de datos, use InnoDB. No puedes comparar los dos .
Jeremy Stein

Si bien muchas de las respuestas a continuación son correctas, en mi humilde opinión no se reducen las cosas. Este sitio sí, y el punto principal: InnoDB es el bloqueo de nivel de fila, MyISAM es el bloqueo de nivel de tabla. Esto significa que, en términos generales, MyISAM será mejor para OLAP (análisis, principalmente lecturas) e InnoDB será mejor para OLTP (transacciones, principalmente escrituras, o al menos muchas escrituras).
Mike Williamson

Respuestas:


159

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 ):

  • InnoDB tiene bloqueo de nivel de fila, MyISAM solo puede realizar bloqueo de nivel de tabla completo.
  • InnoDB tiene una mejor recuperación de fallos.
  • MyISAM tiene FULLTEXTíndices de búsqueda, InnoDB no lo hizo hasta MySQL 5.6 (febrero de 2013).
  • InnoDB implementa transacciones, claves foráneas y restricciones de relación, MyISAM no.

querido señor, así que, en última instancia, ¿qué se debe usar? MyISAM o InnoDB? Estoy totalmente confundido ... mi sitio web está usando MySQL y necesito decidir esto.
sqlchild

3
depende de la aplicación, escriba una lista con las características que necesitará (por ejemplo, búsqueda de texto completo, claves foráneas ...) e intente elegir una (intente calificar cada característica y luego cuente la puntuación). no podrá tenerlos todos, pero depende de usted decidir qué función de bruja se necesita más.
poelinca

2
Edité su publicación para aclarar.
Mathias Lykkegaard Lorenzen

1
@MathiasLykkegaardLorenzen gracias, esa es una de las razones por las que nos gusta stackexchange
poelinca

a partir de version 5.6.4InnoDB admite la FULLTEXTbúsqueda. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
daydreamer el

85

Otra diferencia importante que aún no se menciona es cómo se realiza el almacenamiento en caché de cada motor de almacenamiento.

MYISAM

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.

InnoDB

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:

  • Paso 1) Agregue innodb_log_file_size = NNN a /etc/my.cnf (NNN debe ser el 25% de innodb_buffer_pool_size o 2047M, lo que sea menor)
  • Paso 2) service mysql stop
  • Paso 3) rm /var/log/mysql/ib_logfile[01]
  • Paso 4) service mysql start(ib_logfile0 e ib_logfile1 se recrean)

CONSIDERACIÓN

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 gigabytes
  • No se aceptan potencias menores que 0 o mayores que 3

EPÍLOGO

No 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.

  • Si tiene 2 GB de RAM y 16 GB de InnoDB, asigne 512 M como innodb_buffer_pool.
  • Si tiene 2GB de RAM y 4GB de índices MyISAM, asigne 512M como key_buffer_size.
  • Si tiene 2 GB de RAM y 4 GB de índices MyISAM y 16 GB de InnoDB, asigne 512M como key_buffer_size y 512M como innodb_buffer_pool_size.

¡Los escenarios posibles son infinitos!

Recuerde, lo que sea que asigne, deje suficiente RAM para las conexiones DB y el sistema operativo.


¡Esas son malas fórmulas!
Rick James

(Ups, sigue olvidando que no puede tener párrafos) ... Agregaré una "respuesta".
Rick James

Las fórmulas de Rolando para tamaños de caché no son prácticas. - No se necesitan potencias de 2. - 4 GB en un sistema operativo de 32 bits es imposible - Etc. Aquí está mi resumen sobre qué configurarlos en: mysql.rjweb.org/doc.php/memory (aborda varias otras configuraciones que afectan el uso de la memoria)
Rick James

2
@Rick: Los poderes de 2 estaban destinados a mostrar las respuestas en diferentes unidades. Hacer (SELECCIONAR 2 PowerOfTwo) Establece la visualización de la respuesta en MB. Hacer (SELECCIONAR 3 PowerOfTwo) Configura la pantalla en GB. (SELECCIONE 1 PowerOfTwo) Se muestra en KB. (SELECCIONAR 0 PowerOfTwo) Se muestra en bytes. Eso es lo que hace (SELECT 2 PowerOfTwo). Por lo tanto, es necesario VISUALIZAR SOLAMENTE, no imponer ningún valor asumido en la arquitectura.
RolandoMySQLDBA

2
@ Rick: ¿Sabes qué? De hecho, te daré un +1 por dos razones muy importantes. 1) Su URL confirma que mi respuesta fue correcta, ya que 4 GB es el número más grande para asignar a key_buffer_size. 2) Su respuesta, con su URL, tiene sentido para máquinas con muy poca memoria. Daré crédito donde se deba.
RolandoMySQLDBA

60

InnoDB ofrece:

  • Transacciones ACID
  • bloqueo a nivel de fila
  • restricciones de clave externa
  • recuperación automática de accidentes
  • compresión de tabla (lectura / escritura)
  • tipos de datos espaciales (sin índices espaciales)

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 BYo JOINno 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:

  • rápidas COUNT(*)s (cuando WHERE, GROUP BYo JOINno se utiliza)
  • indexación de texto completo (actualización: compatible con InnoDB desde MySQL 5.6)
  • huella de disco más pequeña
  • compresión de tabla muy alta (solo lectura)
  • tipos e índices de datos espaciales (árbol R) (actualización: compatible con InnoDB desde MySQL 5.7)

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.


55
Leí tu respuesta y la comparé con las otras que ya están aquí. El tuyo es el único que menciona BLOB. Por lo general, se dan por sentados. El suyo también es el único que menciona myisampack, uno de los héroes no reconocidos de las tablas MyISAM de lectura rápida. ¡El tuyo es un +1 hoy!
RolandoMySQLDBA

2
El ejemplo sería una tabla comprimida de solo lectura donde tiene actualizaciones poco frecuentes al reemplazar completamente la tabla.
dabest1

30

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 INSERTy UPDATEusando 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 myisamchkmitad del tiempo, negando cualquier aumento de rendimiento ...

(Mi experiencia personal: un DB de 2 terabytes en MyISAM).


29

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.

Integridad referencial

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.

Transacciones y Atomicidad

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.

Bloqueo de mesa vs bloqueo de fila

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 .

Transacciones y Rollbacks

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

Fiabilidad

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.

Indexación FULLTEXT

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.

Conclusión

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.


1
Gracias, resumen realmente informativo y claro.
informatik01

18

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:

  1. InnoDB admite transacciones y claves foráneas. MyISAM no lo hace.
  2. MyISAM utiliza indexación de texto completo.
  3. MyISAM hace un mal trabajo al hacer cumplir la integridad de los datos.

Desactualizado: InnoDB ahora tiene FULLTEXTy SPATIAL. InnoDB es bueno tanto para cargas pesadas de lectura como de escritura.
Rick James

8

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

  • Fila de nivel de bloqueo
  • Aplicación de clave extranjera
  • Soporte de transacciones
  • Rendimiento exitoso en sistemas de alto uso

55
excepto que la última versión de MySQL ya no usa MyISAM como motor predeterminado. En 5.5 cambiaron el valor predeterminado a InnoDB :). Y no estaría de acuerdo con la generalización de que InnoDB en general solo recibe un "éxito en el rendimiento". InnoDB bien diseñados con una correcta indexación y la configuración de la memoria, así configurados pueden hacer que una tabla InnoDB funciona tan bien como el mismo esquema en MyISAM
TechieGurl

3
En muchas situaciones de "alto uso", InnoDB realmente funciona mucho mejor que MyISAM. MyISAM es una herramienta específica para un problema específico, mientras que InnoDB le servirá mejor en la mayoría de las situaciones (de ahí que el equipo de MySQL lo haya convertido en el motor predeterminado). Debido a que MyISAM fue el único motor durante mucho tiempo, la comunidad MySQL se acostumbró a usar MyISAM de manera predeterminada, incluso después de que InnoDB maduró.
Nick Chammas

2
La búsqueda FULLTEXT para InnoDB se agregó a la mitad del ciclo de desarrollo de MySQL 5.6. La URL citada ahora también cubre InnoDB.
Max Webster

5

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.


5

Incluye cambios de MySQL 5.6

MOTOR DE ALMACENAMIENTO INNODB:

  • Proporciona cumplimiento total de ACID (atomicidad, consistencia, aislamiento, durabilidad). Las versiones múltiples se utilizan para aislar las transacciones entre sí.
  • InnoDB proporciona recuperación automática después de un bloqueo del servidor MySQL o del host en el que se ejecuta el servidor.
  • InnoDB admite claves externas e integridad referencial, incluidas eliminaciones y actualizaciones en cascada.
  • MySQL 5.6 se basa en la plataforma de InnoDB totalmente integrada como motor de almacenamiento predeterminado
  • Estadísticas del optimizador persistente : proporciona una precisión mejorada de las estadísticas del índice de InnoDB y una coherencia entre los reinicios de MySQL.
  • Podando el caché de la tabla InnoDB: para facilitar la carga de memoria en sistemas con un gran número de tablas, InnoDB ahora libera la memoria asociada con una tabla abierta. Un algoritmo LRU selecciona las tablas que han pasado más tiempo sin ser accedidas.
  • Soporta búsqueda de texto completo: un tipo especial de índice, el índice FULLTEXT, ayuda a InnoDB a manejar consultas y operaciones DML que involucran columnas basadas en texto y las palabras que contienen. Estos índices se representan físicamente como tablas enteras de InnoDB.
  • InnoDB parece ser mucho más rápido en la búsqueda de texto completo que MyISAM

Por lo tanto, no tiene sentido usar MyISAMEngine si ya está actualizado a 5.6, de lo contrario, no espere la actualización a MySQL 5.6.

InnoDB VS rendimiento MyISAM usando MySQL 5.6


2

MyISAM

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 TABLEEl 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

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.

tenedores

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.