El motor de almacenamiento MySQL MyISAM e InnoDB hablan en detalle

I. Resumen

La base de datos MySQL admite una variedad de motores de almacenamiento, incluidos MyISAM, InnoDB, MERGE, MEMORY (HEAP), BDB (BerkeleyDB), EXAMPLE, FEDERATED, ARCHIVE, CSV, BLACKHOLE, etc.

Podemos show enginesverificar el soporte para los tipos de motores de MySQL instalados en nuestro sistema a través de instrucciones:
Inserte la descripción de la imagen aquí

También puede show variables like '%storage_engine%'ver el motor de almacenamiento utilizado por MySQL de forma predeterminada a través de las instrucciones. En la siguiente figura, puede ver que el motor de almacenamiento predeterminado para MySQL en mi sistema es InnoDB.
Inserte la descripción de la imagen aquí

Mi versión de MySQL es 5.7.32:
Inserte la descripción de la imagen aquí
MyISAM es el motor de almacenamiento que viene con MySQL; InnoDB es desarrollado por una empresa externa y se integra en MySQL en forma de complemento.
Antes de la versión 5.5, MyISAM era el motor de base de datos predeterminado de MySQL; las versiones posteriores de MySQL usaban más InnoDB por defecto.

Este artículo analiza principalmente MyISAM e InnoDB de uso común.


Dos, MyISAM e InnoDB hablan en detalle

1. Comparar

1. Estructura de almacenamiento
1) MyISAM
Cada MyISAM se almacena como tres archivos en el disco. El nombre del primer archivo comienza con el nombre de la tabla y la extensión indica el tipo de archivo.
.frm: archivo de estructura de tabla
. MYD: archivo de datos.
MYI: archivo de índice

El archivo de índice guarda la ubicación del archivo de datos donde se encuentra el registro. Después de obtener la información de ubicación al leer el archivo de índice, los datos se obtienen rápidamente al leer el archivo de datos.
Inserte la descripción de la imagen aquí
2) InnoDB
solo tiene dos archivos:
.frm: archivo de estructura de tabla.
Ibd: datos, archivo de índice

InnoDB utiliza un índice agrupado para implementar un índice de árbol B. El índice agrupado se implementa almacenando de forma compacta las filas de datos y las claves primarias adyacentes en un archivo.
El tamaño de la tabla InnoDB solo está limitado por el tamaño del archivo del sistema operativo, que generalmente es de 2 GB.
Inserte la descripción de la imagen aquí
InnoDB usa tablespace (tablespace) para administrar datos, almacenar datos de tablas e índices. Antes de mysql5.6.6, se usaba un espacio de tabla compartido y en versiones posteriores se usaba un solo espacio de tabla.

  • Espacio de tabla compartido: ibdata1 e ibdata2 se almacenan en la carpeta Datos y todas las tablas se comparten.
  • Espacio de tabla simple: Se puede abrir mediante variables globales, después de la apertura, cada tabla tiene su correspondiente .ibd correspondiente.
# When innodb_file_per_table is enabled (the default in 5.6.6 and higher), InnoDB stores the data and indexes for each newly created table
# in a separate .ibd file, rather than in the system tablespace.
innodb_file_per_table=1

Puede show variables like '%innodb_file_per_table%'comprobar si mysql abre un espacio de tabla separado a través de las instrucciones: las ventajas y desventajas del
Inserte la descripción de la imagen aquí
espacio de tabla compartido y el espacio de tabla único :
1) Espacio de tabla único
Ventajas:
-Cada tabla tiene su propio espacio de tabla independiente.
-Los datos e índices de cada tabla se almacenarán en su propio espacio de tabla.
-Una sola tabla se puede mover en diferentes bases de datos.
-Se puede recuperar el espacio (el espacio de la tabla de operaciones de eliminar / truncar no se puede recuperar automáticamente).
-Para las tablas que usan espacios de tabla independientes, no importa cómo los elimine, la fragmentación del espacio de tabla no afectará el rendimiento demasiado seriamente y hay oportunidades para lidiar con ello.
Desventajas:
-El aumento de tabla única es mayor que el método de espacio compartido.

2) Espacio de tabla común
Ventajas:
-El espacio de tabla puede dividirse en varios archivos y almacenarse en cada disco (el tamaño del archivo de espacio de tabla no está limitado por el tamaño de la tabla, por ejemplo, una tabla se puede distribuir en diferentes archivos).
-El límite de tamaño ya no es el límite de tamaño del archivo, sino su propio límite. Como puede ver en la documentación oficial de Innodb, el límite máximo de su espacio de tabla es de 64 TB.

Desventajas: -Todos los
datos e índices se almacenan en un archivo. Habrá un archivo muy grande. Aunque un archivo grande se puede dividir en varios archivos pequeños, se almacenan varias tablas e índices en el espacio de tabla. Después de una gran cantidad de borrado Las operaciones se realizan en una tabla, habrá una gran cantidad de huecos en el espacio de la tabla, especialmente para el análisis estadístico, el sistema de registro es el menos adecuado para aplicaciones como el espacio de tabla compartido.

2. Transacciones
1) MyISAM
no admite transacciones. Énfasis en el rendimiento, la ejecución es más rápida que el tipo InnoDB.

2) InnoDB
admite transacciones. Proporcione funciones de base de datos avanzadas, como claves externas.
AUTOCOMMIT de InnoDB está activado de forma predeterminada, es decir, cada declaración SQL se encapsulará en una transacción de manera predeterminada y se enviará automáticamente, pero esto afectará la eficiencia; podemos fusionar transacciones y mostrar múltiples declaraciones SQL entre begin y commit para formar una composición Reenviar una transacción para reducir la sobrecarga causada por múltiples envíos de la base de datos y mejorar el rendimiento.

3. Operación CURD
1) MyISAM

  • Si realiza una gran cantidad de selecciones, MyISAM es la mejor opción.

2) InnoDB

  • Si realiza mucho INSERT o UPDATE, InnoDB debe usarse en términos de rendimiento;
  • Ejecutar delete from table, InnoDB no volverá a crear la tabla, sino que eliminará fila por fila;
  • load table from masterLa operación no funciona para InnoDB.Solución: Cambie InnoDB a la tabla MyISAM, importe los datos y luego cambie a InnoDB. Sin embargo, no se aplica a las tablas que usan funciones adicionales de InnoDB (claves externas).

4 、 AUTO_INCREMENT
1) MyISAM

  • MyISAM actualiza automáticamente esta columna para las operaciones INSERT y UPDATE, haciendo que la columna AUTO_INCREMENT sea más rápida. Una vez que se elimina el valor en la parte superior de la secuencia, no se puede reutilizar. (Cuando la columna AUTO_INCREMENT se define como la última columna de un índice de varias columnas, el valor eliminado de la parte superior de la secuencia se puede reutilizar)
  • El valor AUTO_INCREMENT se puede restablecer con ALTER TABLE o myisamch.
  • Para campos de tipo AUTO_INCREMENT, se puede establecer un índice conjunto con otros campos.

2) InnoDB

  • Si especifica una columna AUTO_INCREMENT para una tabla, el identificador de la tabla InnoDB en el diccionario de datos contiene un contador llamado contador de incremento automático, que se utiliza para asignar un nuevo valor a la columna.
  • El contador de incremento automático solo se almacena en la memoria principal, no en el disco.

5, fila de la tabla
1)
Número específico de filas de MyISAM Tabla de almacenamiento de MyISAM en la consulta select count(*) from tablecuando el número de filas de la consulta en la tabla, simplemente lea el número de filas para guardar.
Sin embargo, cuando la declaración count (*) contiene condiciones where, debe escanear toda la tabla para obtener el número de filas.

2) InnoDB
InnoDB no guarda el número específico de filas en la tabla. Al ejecutar el recuento de selección (*) de la tabla, InnoDB escaneará toda la tabla para calcular cuántas filas hay.

6. Bloqueo Bloqueo
de nivel de mesa: -Al insertar una mesa, el bloqueo de nivel de mesa bloquea toda la mesa.
-Baja sobrecarga, bloqueo rápido, sin interbloqueo, gran granularidad de bloqueo (toda la tabla), baja concurrencia y alta probabilidad de contención de bloqueo.
Bloqueo de nivel de fila: -Utilice el bloqueo de nivel de fila para cambiar múltiples atributos para un dato.
-Alta sobrecarga, bloqueo lento, interbloqueos, granularidad de bloqueo mínima (una fila de datos), alta concurrencia y baja probabilidad de contención de bloqueo.
Bloqueo de nivel de página: -Los datos se almacenan en el disco como una página, una página es 4K. Para una tabla relativamente grande (como decenas de millones), bloquee parte de los datos de la tabla en este momento y solo se permite una operación en una página.
-La sobrecarga, la velocidad de bloqueo, la granularidad del bloqueo y la simultaneidad se encuentran entre los bloqueos a nivel de tabla y los bloqueos a nivel de fila, y se producirán interbloqueos.

1) MyISAM
proporciona bloqueos de mesa.

2) InnoDB
proporciona bloqueos de fila y bloqueos de tabla.

Los bloqueos de filas se implementan bloqueando elementos de índice, que fallarán en las siguientes situaciones y bloquean toda la tabla:

  • No recuperar datos por condiciones de índice, como update table set a=1 where user like '%lee%'.
  • DELETE FROM mytableTal declaración de eliminación.

7. Clave principal de tabla
1) MyISAM
permite que existan tablas sin índices ni claves primarias, y los índices son las direcciones donde se almacenan las filas.

2) InnoDB
almacena el valor del índice (el valor de la clave principal ) para el índice de la clave principal y también almacena los datos de cada columna. Si la clave principal no está configurada, intentará utilizar la clave externa como clave principal. Si no hay una clave externa, se generará automáticamente un ROWID oculto como clave principal. InnoDB tiene un rango de clave principal más grande, hasta 2 veces mayor que el de MyISAM.

8. Índice de texto completo
1) MyISAM
admite el índice de texto completo (tipo FULLTEXT).

2) InnoDB
no admite la indexación de texto completo (tipo FULLTEXT), pero puede utilizar el complemento sphinx para admitir la indexación de texto completo y el efecto es mejor.

P: ¿Por qué InnoDB no admite la indexación de texto completo?
Los datos de InnoDB ya están en el nodo. Si desea indexar el texto completo, es equivalente a copiar una base de datos.

P: ¿Qué motor de almacenamiento se debe utilizar para los artículos del sistema de blogs?
Es mejor almacenar los artículos del sistema de blogs en MyISAM. Los nodos hoja de InnoDB se utilizan para almacenar artículos, lo que hace que los nodos hoja sean demasiado grandes y no sean adecuados para almacenar artículos. El índice de texto completo del sistema de blogs es un resumen y un valor MD5 para la consulta.

P: ¿Qué es más rápido para encontrar datos?
Para una tabla, MyISAM puede agregar el árbol de índice de toda la tabla a la memoria y luego encontrarlo en el disco. InnoDB agrega parte de los datos a la memoria porque puede obtener los datos directamente.
Para encontrar un dato (con menos datos), MyISAM es más rápido que InnoDB, e InnoDB es más rápido que MyISAM cuando hay más datos para consultar. Esto se debe a que MyISAM lee un dato cada vez que lee el disco, e InnoDB Puede guardar los datos de uso común. Parte de los datos se almacena en la memoria.

2. Escenarios de uso

1) MyISAM

  • La operación de lectura es el negocio principal y UPDATE es relativamente pequeño, por lo que es adecuado para usar MyISAM.
  • La concurrencia no es alta.
  • La cantidad de datos de la tabla es pequeña.
  • Los recursos de hardware son limitados.

2) InnoDB

  • La cantidad de lecturas y escrituras es pequeña y los campos grandes se actualizan con frecuencia. Elija InnoDB.
  • El volumen de datos de la tabla supera los 10 millones y la simultaneidad es alta.
  • Los requisitos de seguridad y fiabilidad son elevados.

Supongo que te gusta

Origin blog.csdn.net/locahuang/article/details/110475389
Recomendado
Clasificación