[Entrevista] ¿Cuál es la diferencia entre InnoDB y MyISAM en MySQL?

prefacio

Muchos estudiantes usan MySQL como su propia base de datos, pero es posible que hayan usado declaraciones SQL y algunos métodos de escritura ORM, pero no saben mucho sobre la implementación subyacente. Por ejemplo, en la pregunta anterior, es posible que no quede muy claro qué son InnoDB y MyISAM, respectivamente. Sin embargo, en las preguntas de la entrevista de algunas grandes empresas (como Tencent), tales preguntas pueden aparecer con frecuencia, por lo que es muy importante comprenderlas correctamente.

De hecho, InnoDB y MyISAM son dos "motores de almacenamiento" de MySQL.

1. Motor de almacenamiento de base de datos

El motor de almacenamiento de la base de datos es la organización de software subyacente de la base de datos, y el sistema de administración de la base de datos (DBMS) utiliza el motor de datos para crear, consultar, actualizar y eliminar datos. Los diferentes motores de almacenamiento proporcionan diferentes mecanismos de almacenamiento, técnicas de indexación, niveles de bloqueo y otras funciones.Usando diferentes motores de almacenamiento, también puede obtener funciones específicas.

En segundo lugar, ¿cómo sabe qué motor utiliza su base de datos?

SHOW ENGINES;

3. El principio del motor de almacenamiento.

Primero, responda la pregunta "¿Cuál es la estructura de datos del índice que utilizan los motores MyISAM e InnoDB" que se le puede hacer en la entrevista:

Ambos son árboles B+, pero la diferencia es:

  • El contenido almacenado en la estructura de datos del árbol B+ en MyISAM es el valor de dirección de los datos reales Su índice está separado de los datos reales, pero el índice se usa para apuntar a los datos reales. Este tipo de índice se denomina índice no agrupado.
  • Los datos reales se almacenan en la estructura de datos del árbol B+ en InnoDB , y este tipo de índice se denomina índice agrupado.

4. Árbol B y árbol B+

Entonces, ¿qué es un árbol B+?
inserte la descripción de la imagen aquí
El árbol B+ es una variante del árbol B, para el árbol B:

El árbol B pertenece al árbol de bifurcación múltiple, también conocido como árbol de búsqueda multidireccional balanceado, y sus reglas son:

  • Todas las palabras clave de los nodos se organizan en orden ascendente y siguen el principio de la izquierda pequeña y la derecha grande.
  • Número de nodos secundarios: el número de nodos secundarios de nodos que no son hojas> 1, y <= M, y M> = 2, excepto para árboles vacíos (Nota: el orden M representa cuántas rutas de búsqueda tiene un nodo de árbol como máximo, M = M rutas, cuando M = 2 es un árbol binario, y M = 3 es un 3-fork)
  • Número de palabras clave: el número de palabras clave en el nodo de rama es mayor o igual a ceil(m/2)-1 y menor o igual a M-1 (Nota: ceil() es una función que redondea hacia infinito positivo, como ceil(1.1) da como resultado 2)
  • El puntero del nodo hoja es nulo y el nodo hoja tiene la misma profundidad

Y para el árbol B+:

  • El árbol B+ es una versión mejorada del árbol B. En comparación con el árbol B, el árbol B+ hace un uso completo del espacio del nodo, lo que hace que la velocidad de consulta sea más estable y su velocidad está completamente cerca de la búsqueda binaria.

5. Mi ISAM

Volviendo a MyISAM, su estructura de índice se muestra en la figura a continuación, porque el archivo de índice de MyISAM solo guarda la dirección del registro de datos. En MyISAM, no hay diferencia en la estructura entre el índice primario y el índice secundario (clave secundaria): El
inserte la descripción de la imagen aquí
algoritmo de recuperación de índice en MyISAM consiste en buscar primero el índice de acuerdo con el algoritmo de búsqueda B+Tree. Si existe la clave especificada, saque el valor de su campo de datos y luego use el valor del campo de datos como la dirección para leer el registro de datos correspondiente.

6. InnoDB

Para InnoDB, el archivo de datos de la tabla en sí mismo es una estructura de índice organizada por B+Tree, y el dominio de datos del nodo hoja de este árbol almacena registros de datos completos.
inserte la descripción de la imagen aquí

Dado que InnoDB usa la clave principal de la base de datos como clave de índice, el archivo de la tabla de datos de InnoDB en sí mismo es el índice principal, y debido a que el archivo de datos de InnoDB debe agregarse de acuerdo con la clave principal, la tabla que usa InnoDB como motor de datos debe tener una clave principal. Si no se especifica explícitamente, MySQL intentará seleccionar automáticamente una columna que pueda identificar de manera única los datos como clave principal. Si no se puede encontrar, se generará un campo implícito como clave principal. La longitud de este campo es de 6 bytes y el tipo es un entero largo.

7. La diferencia entre InnoDB y MyISAM

  • InnoDB admite transacciones, pero MyISAM no. Para InnoDB, cada lenguaje SQL se encapsula en una transacción de forma predeterminada y se envía automáticamente. Esto afectará la velocidad, por lo que es mejor poner varios lenguajes SQL entre el inicio y el compromiso para formar una transacción;

  • InnoDB admite claves externas, mientras que MyISAM no. La conversión de una tabla InnoDB que contenga claves externas a MYISAM fallará;

  • InnoDB es un índice agrupado. El archivo de datos está vinculado al índice y debe tener una clave principal. La eficiencia de la indexación a través de la clave principal es muy alta. Sin embargo, el índice auxiliar requiere dos consultas, primero se consulta la clave principal y luego se consultan los datos a través de la clave principal. Por lo tanto, la clave principal no debe ser demasiado grande, porque si la clave principal es demasiado grande, otros índices también lo serán. Y MyISAM es un índice no agrupado, el archivo de datos está separado y el índice almacena el puntero del archivo de datos. Los índices de clave principal y los índices secundarios son independientes.

  • InnoDB no guarda el número específico de filas en la tabla y requiere un escaneo completo de la tabla al ejecutar select count(*) from table. Sin embargo, MyISAM usa una variable para guardar el número de filas en toda la tabla.Al ejecutar la declaración anterior, solo necesita leer la variable y la velocidad es muy rápida;

  • Innodb no admite la indexación de texto completo, mientras que MyISAM admite la indexación de texto completo y MyISAM tiene una mayor eficiencia de consulta

MiISAM InnoDB
Diferencias en la composición: 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. Los archivos .frm almacenan definiciones de tablas. Los archivos de datos tienen la extensión .MYD (MYData). Los archivos de índice tienen la extensión .MYI (MYIndex). El recurso basado en disco es el archivo de datos del espacio de tabla de InnoDB y su archivo de registro. El tamaño de la tabla de InnoDB solo está limitado por el tamaño del archivo del sistema operativo, generalmente 2 GB.
Aspectos del procesamiento de transacciones: La tabla de tipo MyISAM enfatiza el rendimiento y su ejecución es más rápida que el tipo InnoDB, pero no proporciona soporte para transacciones. InnoDB proporciona transacciones de soporte de transacciones, clave externa (clave externa) y otras funciones avanzadas de base de datos
SELECT UPDATE,INSERT,Deletefuncionar Si realiza mucho SELECT, MyISAM es la mejor opción 1. Si sus datos realizan una gran cantidad de INSERTAR o ACTUALIZAR, por razones de rendimiento, debe usar la tabla

2 de InnoDB. Cuando ELIMINAR DE la tabla, InnoDB no recreará la tabla, sino que la eliminará fila por fila.

3. La operación LOAD TABLE FROM MASTER no funciona para InnoDB. La solución es cambiar primero la tabla InnoDB a una tabla MyISAM y luego cambiarla a una tabla InnoDB después de importar los datos, pero no se aplica a tablas con características adicionales de InnoDB (como claves foráneas)
Acciones en ****AUTO_INCREMENT Manejo interno de una columna AUTO_INCREMEN por tabla. MyISAM actualiza automáticamente esta columna** para las operaciones INSERTAR y ACTUALIZAR. Esto hace que las columnas AUTO_INCREMENT sean más rápidas (al menos un 10 %). Una vez que se elimina el valor en la parte superior de la secuencia, no se puede reutilizar. (Cuando una columna AUTO_INCREMENT se define como la última columna de un índice de varias columnas, puede haber casos en los que se reutilicen valores eliminados de la parte superior de la secuencia). El valor AUTO_INCREMENT se puede restablecer con ALTER TABLE o myisamch Para campos de tipo AUTO_INCREMENT, InnoDB debe contener solo el índice del campo, pero en las tablas MyISAM, puede crear un índice conjunto con otros campos para un mejor y más rápido procesamiento de auto_incremento 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 nuevos valores a la columna. El contador de incremento automático solo se almacena en la memoria principal, no en el disco. Para la implementación del algoritmo de este contador, consulte Cómo funcionan las columnas AUTO_INCREMENT en InnoDB
El número específico de filas en la tabla. seleccione count() de la tabla, MyISAM simplemente lee el número de filas guardadas. Tenga en cuenta que cuando la instrucción count() contiene la condición where, las operaciones de las dos tablas son las mismas InnoDB no guarda el número específico de filas en la tabla, es decir, al ejecutar select count(*) from table, InnoDB necesita escanear toda la tabla para calcular cuántas filas hay
Cerrar bloqueo de mesa Proporciona bloqueo de fila (bloqueo en el nivel de fila) y lectura sin bloqueo en SELECT consistentes con el tipo de Oracle. Además, el bloqueo de fila de la tabla InnoDB no es absoluto. Si MySQL no puede determinar el rango que se escaneará al ejecutar una instrucción SQL, la tabla InnoDB también bloqueará toda la tabla. Por ejemplo, actualice el conjunto de tablas num=1 donde el nombre sea "%aaa%"

Al seleccionar un motor de almacenamiento, se debe seleccionar un motor de almacenamiento adecuado de acuerdo con las características del sistema de aplicación. Para sistemas de aplicaciones complejos, también se pueden seleccionar múltiples motores de almacenamiento para combinarlos de acuerdo con la situación real. Los siguientes son los entornos de uso de varios motores de almacenamiento de uso común.

  • InnoDB: es el motor de almacenamiento predeterminado de Mysql para aplicaciones de procesamiento de transacciones y admite claves externas. Si la aplicación tiene requisitos relativamente altos para la integridad de la transacción, requiere coherencia de datos en condiciones simultáneas y las operaciones de datos incluyen muchas operaciones de actualización y eliminación además de inserción y consulta, entonces el motor de almacenamiento InnoDB es una opción más adecuada. El motor de almacenamiento InnoDB no solo puede reducir eficazmente el bloqueo causado por la eliminación y la actualización, sino que también garantiza el envío y la reversión completos de las transacciones. Para sistemas con requisitos de alta precisión de datos, como sistemas de facturación o sistemas financieros, InnoDB es la opción más adecuada.
  • MyISAM: si la aplicación consiste principalmente en operaciones de lectura e inserción, con pocas operaciones de actualización y eliminación, y los requisitos de integridad y concurrencia de transacciones no son muy altos, entonces este motor de almacenamiento es muy adecuado para elegir.
  • MEMORIA: guarde todos los datos en RAM y proporcione acceso a varios bloques en situaciones en las que es necesario localizar rápidamente registros y otros datos similares. La desventaja de la MEMORIA es que existe un límite para el tamaño de la tabla. Una tabla que es demasiado grande no se puede almacenar en caché en la memoria. La segunda es garantizar que los datos de la tabla se puedan restaurar. Después de que la base de datos finalice de manera anormal, los datos de la tabla se pueden restaurar. Las tablas MEMORY generalmente se usan para tablas pequeñas que no se actualizan con frecuencia para obtener resultados de acceso rápidamente.
  • MERGE: se utiliza para combinar lógicamente una serie de tablas MyISAM equivalentes y hacer referencia a ellas como un objeto. La ventaja de la tabla MERGE es que puede superar el límite de tamaño de una sola tabla MyISAM y, al distribuir diferentes tablas en varios discos, la eficiencia de acceso de la tabla MERGE se puede mejorar de manera efectiva. Esto es ideal para almacenar entornos VLDB como el almacenamiento de datos.

Resumir

Para las preguntas de la entrevista, generalmente solo se le pide que responda las diferencias entre InnoDB y MyISAM en uso. Sin embargo, si necesita profundizar en por qué existen esas diferencias, debe comprender los principios de implementación subyacentes. Por cierto, también debe tener una cierta comprensión del árbol B +. Creo que después de leer este artículo, los lectores ya pueden tener una comprensión más clara de los principios detrás de él, y está un paso más cerca de obtener la Oferta deseada.

Supongo que te gusta

Origin blog.csdn.net/u011397981/article/details/131911557
Recomendado
Clasificación