En lo que respecta a MySQL, sería difícil entender MyISAM e InnoDB, que son dos de los motores de almacenamiento MySQL más conocidos y utilizados. Hoy os hablaré sobre la diferencia entre MyISAM e InnoDB en MySQL...
¿Qué es MyISAM?
MyISAM es el motor de almacenamiento predeterminado para el sistema de gestión de bases de datos relacional MySQL (antes de la versión 5.5)。 Esta estructura de almacenamiento de tablas MySQL extiende muchas características útiles del antiguo código ISAM. En la nueva versión de MySQL, el motor InnoDB está reemplazando ampliamente a MyISAM debido a sus ventajas en términos de transacciones, integridad referencial y mayor concurrencia. Cada tabla MyISAM corresponde a tres archivos en el disco duro. Los tres archivos tienen el mismo nombre, pero diferentes extensiones para indicar su propósito tipo: el archivo .frm contiene la definición de la tabla, pero este archivo no forma parte del motor MyISAM, sino del servidor; .MYD contiene los datos de la tabla; .MYI es el archivo índice de la tabla.
¿Qué es InnoDB?
InnoDB es otro motor de almacenamiento para MySQL, y la nueva versión del estándar publicado por MySQL AB está incluida en todos los paquetes de instalación binaria.A partir de la 5.5 como motor de almacenamiento por defecto。 Sus ventajas frente a otros motores de almacenamiento son su soporte para transacciones compatibles con ACID (similar a PostgreSQL) y la integridad de parámetros (es decir, soporte para claves extranjeras).
Oracle Corporation adquirió Innobase en octubre de 2005. Innobase utiliza autorización de autenticación dual. Se distribuye usando GNU y también permite a otros grupos que desean incorporar InnoDB en software comercial obtener una licencia.
Los motores de almacenamiento más populares son MyISAM e InnoDB. Las principales diferencias entre MyISAM e InnoDB son el rendimiento y el control de las transacciones. MyISAM es una implementación extendida del primer ISAM (Indexed Sequential Access Method, ISAM ya no es compatible después de MySQL 5.0). ISAM está diseñado para manejar situaciones donde la frecuencia de lectura es mucho mayor que la frecuencia de escritura, por lo que ISAM y MyISAM posterior no consideran el soporte de cosas, excluyen TPM, no necesitan registros de transacciones, la eficiencia de consulta ISAM es considerable y el consumo de memoria es muy pequeño. MyISAM hereda estos beneficios mientras se mantiene al día con la gran cantidad de nuevas funciones útiles y herramientas relacionadas. Por ejemplo, considerando el control de concurrencia, se proporcionan bloqueos a nivel de tabla, y aunque MyISAM en sí no soporta tolerancia a fallos, puede usarse para recuperar fallos a través de myisamchk. Y dado que MyISAM utiliza sus propios archivos de almacenamiento independientes (archivo de datos MYD y archivo índice MYI) para cada tabla, es muy cómodo hacer copias de seguridad y restaurar (la sobreescritura de copia es suficiente), y también soporta recuperación en línea. En comparación con otros motores de almacenamiento, MyISAM tiene la mayoría de las herramientas para revisar y reparar tablas. Las tablas MyISAM pueden comprimirse y soportan búsqueda en texto completo. No son seguros para transacciones y no soportan claves extranjeras, así que si tu aplicación no requiere transacciones y solo gestiona operaciones básicas de CRUD, entonces MyISAM es la mejor opción. InnoDB está diseñado para situaciones de alta concurrencia en lectura y escritura, utilizando MVCC (Multi-Version Concurrency Control) y bloqueos a nivel de fila para proporcionar soporte de transacciones compatibles con ACID. InnoDB soporta la integridad de referencia de clave extranjera y cuenta con capacidades de recuperación de fallos. Además, el rendimiento de InnoDB es en realidad bastante bueno, especialmente al procesar grandes cantidades de datos, en términos oficiales: la eficiencia de CPU de InnoDB es incomparable con la de otros motores de almacenamiento de bases de datos relacionales basados en disco. Sin embargo, la copia de seguridad y recuperación de InnoDB es algo más problemática, a menos que utilices el soporte de espacio de tapas múltiples proporcionado por la versión 4.1 o posterior, ya que a diferencia de MyISAM, los archivos de datos de InnoDB no corresponden a cada tabla de forma independiente. En su lugar, se utiliza el espacio compartido en la mesa, y el método simple de sobreescritura por copia no es adecuado para él, y los datos deben restaurarse tras detener MYSQL. Usar tablespacesd por tabla hace que cada tabla corresponda a un archivo de tablespace separado, la situación es mucho más sencilla. Tiene las mismas características que los tipos BDB y también soportan claves extranjeras. Las tablas InnoDB son rápidas y tienen funciones más ricas que BDB, por lo que se recomienda si necesitas un motor de almacenamiento transaccionalmente seguro.
En general, InnoDB es una buena opción si se necesita soporte para transacciones y tiene una alta frecuencia de lectura y escritura concurrente. Se puede considerar BDB si la frecuencia de lecturas y escrituras concurrentes no es alta, pero BDB ya no será compatible en MySQL 5.1 y versiones posteriores. Esta opción ha desaparecido
Por defecto, las transacciones de InnoDB están abiertas (se establece autocommit = 0), lo que significa que cada vez que se inserta un registro, la tabla de InnoDB lo tratará como una transacción separada. Así que si insertamos 10.000 registros y no cerramos la transacción, entonces la tabla tipo InnoDB lo tratará como 10.000 transacciones, y el tiempo total de inserción en ese momento es mucho, en este momento debemos desactivar primero la transacción y luego insertarla, así que la velocidad será muy rápida. En cuanto al Heap y BDB (Berkeley DB), relativamente hablando, la tasa de penetración no es tan buena como en las dos anteriores, pero en algunos casos, El motor de almacenamiento de heap sigue siendo muy aplicable, almacena datos en memoria y es extremadamente rápido porque no hay E/S de disco en espera. Pero como es un motor de almacenamiento de memoria, cualquier modificación desaparecerá después de que el servidor se reinicie. El heap es un lugar ideal para usar BDB para pruebas, ya que es el primer motor de almacenamiento transaccionalmente seguro de MySQL. Construido sobre la base de la biblioteca de bases de datos de Berkeley, también es seguro transaccionalmente, pero BDB obviamente no es tan popular como InnoDB, porque la mayoría de los motores de almacenamiento en MySQL que soportan transacciones también buscan MVCC o motores de almacenamiento con bloqueo a nivel de fila, mientras que BDB solo soporta bloqueo a nivel de página.
Motor InnoDB
InnoDB es un motor de almacenamiento transaccional que soporta rollbacks y está diseñado para proporcionar servicios de alto rendimiento al procesar grandes cantidades de datos, además de establecer pools de búfer en memoria en tiempo de ejecución para almacenar datos e índices.
Ventajas del motor InnoDB:
1. Soporte para el procesamiento de transacciones y las funciones de transacciones ACID;
2. Se realizan cuatro niveles de aislamiento del estándar SQL;
3. Soporte restricciones de bloqueo a nivel de fila y clave foránea;
4. Puedes usar registros de transacciones para recuperar datos.
5. El nivel de bloqueo es bloqueo por fila, que es adecuado para modificaciones frecuentes de tabla con alta concurrencia, y alta concurrencia es mejor que MyISAM. La desventaja es que el consumo del sistema es grande.
6. El índice no solo se almacena en caché a sí mismo, sino también los datos, lo que requiere más memoria que MyISAM.
Desventajas del motor InnoDB:
Como no guarda el número de filas de la tabla, se escanea toda la tabla al usar estadísticas COUNT.
Motor MyISAM
MyISAM es el motor por defecto antes de MySQL 5.5.5 y está diseñado para leer rápido.
Ventajas del motor MyISAM:
1. Lectura de alto rendimiento;
2. Debido a que guarda el número de filas en la tabla, no se escaneará toda la tabla al usar estadísticas COUNT;
Desventajas del motor MyISAM:
1. El nivel de la cerradura es una cerradura de mesa, y la ventaja de la cerradura de reloj es que la cerradura es pequeña y la cerradura es rápida; Las desventajas son que la granularidad del bloqueo es grande, la probabilidad de impulso del bloqueo es alta y la capacidad de concurrencia es baja, lo cual es adecuado para servicios basados en consultas.
2. Este motor no soporta transacciones ni claves extranjeras.
3. Las operaciones INSERT y UPDATE deben bloquear toda la tabla;
4. Almacena el número de filas en la tabla, de modo que al SELECT COUNT(*) de la tabla, solo necesita leer directamente los valores guardados sin escanear toda la tabla.
Escenarios aplicables
MyISAM es adecuado para: (1) realizar muchos cálculos de conteo; (2) Inserciones poco frecuentes y consultas muy frecuentes; (3) No hay negocio.
InnoDB es adecuado para: (1) altos requisitos de fiabilidad o transacciones; (2) Las actualizaciones y consultas de tabla son bastante frecuentes, y la probabilidad de bloqueo de tabla es relativamente alta.
Comparación de tablas
| Propiedades | MyISAM | Montón | BDB | InnoDB | | Transacciones | No soportado | No soportado | Brindar apoyo | Brindar apoyo | | Granularidad de bloqueo | Candado de mesa | Candado de mesa | Bloqueo de página (página, 8KB) | Cerradura | | almacenamiento | Archivos divididos | En memoria | Un archivo por tabla | Espacio de mesa | | Nivel de aislamiento | no | no | Lee Comprometido | Todo | | Formato portátil | ser | N/A | no | ser | | Completitud de las citas | no | no | no | ser | | Clave primaria de datos | no | no | ser | ser | | MySQL almacena en caché los registros de datos | no | Sí | Sí | Sí | | usabilidad | Versión completa | Versión completa | MySQL-Max | Versión completa |
Algunas diferencias en los detalles
1. InnoDB no soporta índices de tipo FULLTEXT, que se soportan desde MySQL 5.6 (experimental).
2. InnoDB no guarda el número específico de filas de la tabla, es decir, al ejecutar select count() de la tabla, InnoDB tiene que escanear toda la tabla para calcular cuántas filas hay, pero MyISAM solo necesita simplemente leer el número de filas guardadas. Nótese que cuando la sentencia count() contiene una condición where, la operación es la misma para ambas tablas.
3. Para campos de AUTO_INCREMENT tipo, InnoDB debe contener un índice solo con ese campo, pero en la tabla MyISAM puedes crear un índice conjunto con otros campos.
4. Cuando ELIMINA DE la tabla, InnoDB no recrea la tabla, sino que la elimina línea por línea.
5. La operación LOAD TABLE FROM MASTER no funciona para InnoDB, la solución es primero cambiar la tabla InnoDB por la tabla MyISAM, importar los datos y luego cambiarla a la tabla InnoDB, pero no es aplicable a la tabla que utiliza funciones adicionales de InnoDB (como claves extranjeras).
6. Además, el bloqueo de fila de la tabla InnoDB no es absoluto; si MySQL no puede determinar el rango a escanear al ejecutar una sentencia SQL, la tabla InnoDB también bloqueará toda la tabla.
7. InnoDB no soporta indexación de texto completo, mientras que MyISAM sí. La indexación de texto completo se refiere a crear un índice de orden inverso de cada palabra en char, varchar y texto (excepto las palabras de oclusión). El índice de texto completo de MyISAM es en realidad inútil, porque no soporta segmentación de palabras en chino y debe ser escrito en la tabla de datos por el usuario tras la segmentación, y las palabras con menos de 4 caracteres chinos serán ignoradas como las palabras de parada.
|