Introducción al motor de almacenamiento MySQL y comprensión de la estructura del motor InnoDB

Descripción general del motor de almacenamiento

El motor de datos se ocupa de los archivos de disco donde se almacenan realmente los datos. Su capa superior (capa de servicio) pasa las instrucciones SQL procesadas (resultados de procesamiento y análisis de SQL) al motor de datos, y el motor de datos almacena los datos en archivos de disco de acuerdo con a las instrucciones, o Leer datos de archivo de disco. Por lo tanto, el motor de datos es el núcleo de todo el DBMS y tiene las funciones más esenciales: leer datos y almacenar datos.

El motor de almacenamiento también se puede considerar como el tipo de tabla (el nombre original del motor de almacenamiento 表处理器), porque diferentes tablas pueden elegir diferentes motores de almacenamiento y diferentes motores de almacenamiento tienen diferentes métodos de procesamiento de datos, estructuras de tablas, formatos de archivo, etc.

El motor de almacenamiento de datos de MySQL es conectable, es decir, se puede cambiar a voluntad. La unidad de acción del motor de almacenamiento de datos es una tabla y se puede seleccionar un motor de almacenamiento adecuado para cada tabla.
El motor de almacenamiento predeterminado después de MySQL 5.5 es el motor InnoDB (anteriormente MyISAM), que tiene muchas ventajas en comparación con otros motores de datos (las ventajas específicas se discutirán más adelante), por lo que, excepto en escenarios muy especiales, a menudo se recomienda que ambos las tablas utilizan el motor de almacenamiento predeterminado InnoDB

El flujo general de ejecución de las sentencias SQL
inserte la descripción de la imagen aquí
Cuando queremos operar la base de datos, primero debemos conectarnos al servicio de la base de datos, ya sea utilizando un cliente gráfico o una línea de comando. En resumen, para poder conectar, la capa de conexión debe proporcionar conexión. y autenticación., autorización y otros servicios.
Una vez completada la conexión, podemos ingresar SQL para operar. En este momento, la capa de servicio verificará la semántica y la gramática de la instrucción SQL que ingresamos, creará un árbol de análisis de sintaxis y realizará una optimización automática (antes de la versión 5.7, el caché debe consultarse, si el caché Sí, devolver el resultado almacenado en caché directamente. Debido a que la tasa de aciertos es demasiado baja, se descartó después de la versión 8). Luego entregue los datos procesados ​​a la capa del motor.
La capa del motor es responsable de almacenar o extraer los datos de acuerdo con los resultados de la capa superior. La
capa de almacenamiento realmente almacena los datos y los registros, y los administra con la capa del motor.

Introducción a cada motor de almacenamiento

Puede show enginesver
inserte la descripción de la imagen aquí
. Como se muestra en la figura, se puede ver que MySQL admite 8 tipos de motores de almacenamiento de datos. El motor se usa de manera predeterminada. InnoDBSu característica más importante es que admite transacciones. y transacciones distribuidas, y admite bloqueos de nivel de fila., admite claves externas
Cada motor tiene sus propias características, porque es de código abierto, por lo que las grandes empresas pueden personalizar el motor de acuerdo con el negocio específico.
Los más importantes en la base de datos son InnoDB motor y el motor MyISAM, cada uno de los cuales tiene sus propias ventajas Desventaja, no una relación de reemplazo, un motor utilizado por la versión actual y otro utilizado por la versión anterior

InnoDB

Este motor aparece después de MySQL 3.2 y es el motor de almacenamiento predeterminado después de MySQL 5.5.

Ventajas de InnoDB

  1. El motor InnoDB admite claves externas, pero las claves externas pueden causar problemas de rendimiento
  2. El motor InnoDB admite transacciones (muy importante) e introduce dos operaciones, compromiso y reversión. Para datos importantes, tener transacciones puede garantizar el ACID (atomicidad, consistencia, aislamiento y durabilidad) de los datos. Después de un bloqueo, puede recuperarse por sí mismo y revertir los datos no confirmados.
  3. InnoDB admite el bloqueo a nivel de fila. Cuando varios subprocesos son concurrentes, para resolver el problema de la seguridad de los subprocesos, es necesario bloquear. Otros motores suelen utilizar bloqueos a nivel de tabla. En segundo lugar, InnoDB puede bloquear filas de operaciones específicas, de modo que no afecte las operaciones simultáneas de otros datos en toda la tabla y mejore la eficiencia de la concurrencia. Por lo tanto, las características son particularmente prominentes cuando la cantidad de datos es grande y la cantidad de simultaneidad es alta.

Características de InnoDB

  • Antes de MySQL8, los archivos de almacenamiento de tablas se dividían en dos categorías: estructura de tabla .frm, datos de tabla e índice .idb; después de la versión de MySQL8, la estructura de tabla, los datos de tabla y el índice de tabla se colocaban en un solo archivo .idbpara su almacenamiento.
  • El índice de clave principal de InnoDB almacena todos los datos en el nodo hoja

Desventajas de InnoDB en comparación con MyISAM

  • La consulta por lotes no es tan buena como MyISAM
  • Alto uso de memoria: debido a que InnoDB reúne datos e índices, los datos de esta página también se cargan al cargar páginas hoja. Sin embargo, MyISAM carga la dirección de la dirección de los datos de esta página, lo que ahorra mucho espacio en comparación con los datos, lo que hace que InnoDB tenga mayores requisitos de memoria.

InnoDB no admite índices hash, pero el motor optimizará automáticamente y creará índices hash adaptables basados ​​en consultas dentro del motor. La intervención humana no es posible.
Al agregar una gran cantidad de datos, primero puede eliminar todos los índices en la tabla, agregar en lotes, y luego volver a crearlos. Hace que sea innecesario mantener el índice al agregar, mejorando la eficiencia

Mi SIAM

Ventajas de MySIAM

  • acceso más rápido
  • count (*) es más eficiente en el nivel O (1), porque hay variables para el cálculo estadístico, e InnoDB se usa para verificar el nivel O (n) uno por uno

Desventajas de MySIAM frente a InnoDB:

  • No admite claves foráneas, transacciones, bloqueos de nivel de fila (MyISAM es un bloqueo de nivel de tabla)

El procesamiento de MySIAM es adecuado para concurrencia pequeña y baja (porque los bloqueos de tablas afectan la concurrencia), sin requisitos de integridad de datos (porque no admite transacciones, pero tiene un alto rendimiento), la consulta y la adición son mucho más altas que la modificación y eliminación de tablas, puede ahorrar memoria recursos y mejorar la eficiencia de acceso (se recomienda el motor de datos InnoDB para la mayoría de los escenarios)

Memoria

  • La estructura de la tabla se almacena en el disco y los datos de la tabla se almacenan en la memoria. Debido a que está en la memoria, la velocidad es más rápida, pero también está limitada por el tamaño de la memoria, lo que hace que sea imposible almacenar una gran cantidad de datos.
  • La estructura de índice por defecto es un índice hash, que se caracteriza por ser muy rápido a la hora de localizar un dato, pero no es tan bueno como un índice de árbol B+ a la hora de buscar un rango.
  • Afectado por factores físicos como el tamaño de la memoria y la falla de energía, solo se puede usar para almacenar datos temporales o como caché. Pero estas características son reemplazadas por otro software de servidor, como Redis. Tan inútil.

Comparación de los tres motores.

características InnoDB MiISAM Memoria
asuntos apoyo no apoyo no apoyo
clave externa apoyo no apoyo no apoyo
nivel de bloqueo bloqueo de nivel de fila nivel de mesa nivel de mesa
índice de árbol B+ apoyo apoyo apoyo
índice hash No se admite, pero se crean optimizaciones internas y no se pueden intervenir no apoyo soporte (predeterminado)
velocidad de inserción lento medio rápido (nivel de memoria)
uso de memoria Medio (estructura de índice) Bajo Alto (los datos se almacenan en la memoria)
Escenas a utilizar Una gran cantidad de datos, escritura simultánea, requisitos de transacción Datos pequeños, consumo de recursos de ahorro, negocio simple, sin requisitos de transacción para datos La cantidad de datos es pequeña, no se preocupa por la seguridad de los datos y tiene requisitos de alto rendimiento

La razón principal para usar una base de datos relacional es que sus características transaccionales pueden hacer que los datos sean más seguros Si los datos no requieren características transaccionales, entonces se considerará NoSQL en su lugar.

otros motores

  • Archivo: proporciona la solución perfecta para almacenar y recuperar grandes cantidades de información histórica, archivada o de auditoría de seguridad a la que rara vez se hace referencia. Los índices no son compatibles, las actualizaciones no son compatibles y los bloqueos de nivel de fila son compatibles. Es adecuado para insertar datos que nunca se modifican una vez y tiene menos consultas.
  • Motor CSV: el archivo csv se puede procesar como una tabla mysql. El formato de almacenamiento son archivos csv ordinarios
    y otros motores de uso poco frecuente.

Declaraciones SQL relacionadas con el motor

  • Ver el motor de almacenamiento predeterminado del sistema actual show variables like '%storage_engine%';
    inserte la descripción de la imagen aquí
  • Modifique el motor de almacenamiento predeterminado del sistema SET DEFAULT_STORAGE_ENGINE=引擎名称;. Esta configuración volverá a la configuración original después de que se reinicie el servidor. Se puede my.cnfmodificar en el archivo de configuración de configuración de SQL.
    inserte la descripción de la imagen aquí
  • Especifique el motor de almacenamiento de la tabla al crear la tabla, no especifique el motor de almacenamiento predeterminadoCREATE TABLE 表名( 建表语句; ) ENGINE = 存储引擎名称;
  • Modificar el motor de almacenamiento de la tabla.ALTER TABLE 表名 ENGINE = 存储引擎名称;

motor InnoDB

Lectura recomendada

estructura de almacenamiento lógico

El motor InnoDB se divide en cinco niveles de estructura: de grande a pequeño, es espacio de tabla, segmento, área, página y
espacio de tabla de fila.
El espacio de tabla es la estructura más alta del almacenamiento lógico de InnoDB y se divide en espacio de tabla del sistema. , espacio de tabla independiente, espacio de tabla de propósito general, espacio de tabla temporal y espacio de tabla de deshacer
Después de MySQL 8, por defecto, cada tabla existirá en un espacio de tabla independiente (la estructura todavía se coloca en el espacio de tabla del sistema), y es almacenado en un archivo separado en el disco. Se puede configurar, si se establece en 0, los datos de cada tabla se colocarán en el espacio de tablas del sistema.数据索引xx.ibdinnodb_file_per_tableibdata1


El segmento se divide en segmento de datos, segmento de índice, segmento de reversión, etc. Los datos y los índices de una tabla se colocan en un espacio de tablas y, en un espacio de tablas, los índices y los datos también se dividen en diferentes segmentos para su almacenamiento. De acuerdo con la estructura del árbol de índice B+, el segmento de datos se almacena en el árbol de índice 叶子节点y el segmento de índice se almacena en el árbol de índice 非叶子节点.
El espacio de un segmento se expande con el tamaño de la mesa, el tamaño de la mesa, el tamaño del segmento. Un segmento contiene al menos un área y la unidad de extensión más pequeña de un segmento es un área. El tamaño predeterminado de un área es 1M, es decir, 64 páginas consecutivas. Al realizar la expansión del área, para garantizar la continuidad de las páginas y evitar tanto como sea posible las E/S aleatorias, se solicitarán 4 o 5 áreas del disco cada vez. El tamaño predeterminado de cada página es , exactamente , la página en InnoDB es , el sistema operativo leerá o escribirá 4 veces. Cada nodo en el árbol de índice es una página, y al menos 2 elementos de datos se almacenan en una página. Si inserta datos de forma secuencial en una página de datos completa, se reasigna una nueva página desde la extensión. Si se insertan datos desde la mitad del árbol de índice, se producirá una división de página cuando la página esté llena.



16K是Linux页大小的4倍磁盘与内存交互的最小单位

  • División de página
    El almacenamiento de datos de fila en la hoja debe almacenarse en orden. Si se inserta fuera de orden, si se inserta en una página completa, se producirá una división de página. ¿pensar? ¿Por qué no insertar en una nueva página? Porque el almacenamiento de datos es secuencial. ¿Cómo evitar la división de páginas? No inserte datos en las páginas de datos que están llenas en el medio, es decir, inserción secuencial.
    inserte la descripción de la imagen aquí
    Separe directamente desde la mitad de la página completa, divídala en dos páginas e insértela en una página en orden.
    inserte la descripción de la imagen aquí
    Después de dividir, quedará espacio en la página y luego inserte los datos que se insertarán.
    inserte la descripción de la imagen aquí
    Finalmente, conecte el páginas recién abiertas en orden. Tenga en cuenta que es InnoDB. El motor ha optimizado el árbol bB+. Las páginas están conectadas bidireccionalmente. Las
    inserte la descripción de la imagen aquí
    divisiones de página dan como resultado una gran cantidad de páginas restantes, lo que desperdicia espacio. La división de páginas consume rendimiento, así que intente insertar en orden al insertar datos

  • Fusión de páginas
    Cuando se eliminan datos, el motor InnoDB solo hace una marca. Cuando el número de eliminaciones en una página alcanza el 50% de la página, buscará las páginas anteriores y posteriores para determinar si se pueden fusionar.
    inserte la descripción de la imagen aquí
    Combinar dos páginas que no están llenas. Las filas de datos de la tabla se almacenan en la fila. El tamaño de almacenamiento de cada fila depende del diseño de campo de la tabla y el tamaño de los datos de la fila. InnoDB almacena en unidades de y un página contiene varias filas.
    inserte la descripción de la imagen aquí


Resumir
inserte la descripción de la imagen aquí

arquitectura

inserte la descripción de la imagen aquí

El motor InnoDB consta de tres partes: grupo de memoria, subproceso de fondo y archivo de disco.

parte de la memoria

inserte la descripción de la imagen aquí
De la figura, la memoria se compone principalmente de 4 partes, a saber Buffer Pool, Change buffer, Log Buffer,Adaptive Hash Index

Buffer Pool:
Primera nota : el grupo de búferes 查询缓存no es lo mismo (porque estaba confundido acerca de esto cuando comencé)
Caché de consultas : cuando la capa de servicio recibe el SQL para ejecutar el tipo de consulta, primero va a la caché de consultas de memoria para averiguar si existe tal consulta Si los resultados de la memoria caché SQL no se analizan mediante la sintaxis semántica, etc., finalmente se entregan a la capa del motor para su procesamiento. El Buffer Pool está al nivel del motor. Y este tipo de caché de consultas es muy poco inteligente, es decir, aunque es SQL con la misma semántica, si hay un pequeño cambio (como agregar un espacio), no se puede encontrar el caché del SQL anterior y la tasa de aciertos es muy bajo, que se ha eliminado en la versión MySQL8.
Por qué introducir Buffer Pool :
todo tipo de datos e índices se colocan en el espacio de tablas en forma de páginas, y el espacio de tablas también es una abstracción de archivos en el disco. Es decir, los datos se colocan en el disco.
Sin embargo, existe una brecha entre la velocidad del disco y la memoria.Al acceder a ciertos datos, toda la página donde se encuentran los datos se carga en el disco, lo que mejorará en gran medida la eficiencia. Sin embargo, después de acceder, las páginas no se vacían de nuevo en el disco inmediatamente. En primer lugar, la E/S aleatoria de discos flash tan frecuentes afectará en gran medida el rendimiento. En segundo lugar, los datos de la memoria pueden seguir utilizándose para no leerlos. de nuevo.
Introducción a Buffer Pool :
El tamaño predeterminado de Buffer Pool es 128M, cuanto mayor sea el tamaño de la memoria, más datos, menor será la probabilidad de consultar el disco y mayor será el rendimiento. Por lo tanto, si el dispositivo lo permite, mayor el mejor. Puede haber varios grupos de almacenamiento intermedio, el valor predeterminado es uno y el número también se puede modificar.
El grupo de búfer se basa en páginas, y el tamaño de cada página es el mismo que el tamaño del disco.De 16Kacuerdo con la función de la página, se divide en:, 索引页deshacer 数据页página, insertar caché, hash adaptable, bloquear información, etc.
Según el estado de la página, se divide en:

  • página libre : página libre, página no utilizada en la memoria
  • página limpia : después de que los datos se cargan desde el disco a la memoria, la página no se ha modificado y es consistente con el disco
  • sucio : los datos de la página se han modificado y la página no se ha actualizado en el disco, es decir, la página cuyos datos de memoria no son coherentes con el disco
    En la memoria utilizada por MySQL, normalmente más del 80 % del espacio está dado al grupo de búfer, y su tamaño afectará directamente el rendimiento general. Cuando la memoria no es suficiente, el motor InnoDB utiliza LRU页面置换算法las páginas utilizadas menos recientemente para eliminar del disco las páginas que no se han utilizado recientemente y actualizarlas en el disco. Sin embargo, el motor InnoDB optimiza el algoritmo LUR. Por ejemplo, seleccionar * realizará un escaneo completo de la tabla, lo que permite escanear los datos que se usan con poca frecuencia y convertirlos en los últimos datos usados. El motor InnoDB está optimizado para esta situación.

Changer Pool: También se denomina grupo de búfer de inserción, 是针对非主键索引插入的优化porque la clave principal generalmente se inserta en orden, lo que es más conveniente cuando se vuelve a indexar el árbol de índice de clave principal. (Simplemente agregue nodos de hoja según sea necesario). Al insertar, si se establece un índice de clave no principal, no solo es necesario insertar en el árbol de índice de clave principal, sino también insertar en el árbol de índice de clave no principal. Las claves de índice de los índices de clave no primaria a menudo se insertan fuera de orden, el acceso discreto a los índices de clave no primaria y las E/S aleatorias provocarán una degradación del rendimiento. Al usar el grupo de cambios, al insertar un índice de clave no primaria, primero determine si la página del árbol de índices utilizada para insertar está en la memoria, si existe, insértela directamente, si no existe, coloque la página de índice correspondiente en la memoria después de leer del disco, y luego insertar. Al leer datos, fusione Change Buffer con Buffer Pool y actualice Buffer Pool en el disco con cierta frecuencia.
Por ejemplo: para insertar un dato con id=2 y name='zs', el id es el índice de clave principal, y el nombre es el índice común. Al insertar datos, la identificación se ordena y se inserta directamente en la página de índice de clave principal, mientras que al insertar el nombre, el nombre generalmente está desordenado, lo que requiere colocar parte del índice en el grupo de búfer de inserción e insertarlo primero changer Pool. , enjuáguelo en el disco juntos.提高非主键索引的插入性能


自适应哈希索引 AHI: El motor genera automáticamente un índice hash para las páginas activas, en unidades. Debido a que el índice hash puede acceder a los datos solo una vez sin colisión de hash, y el índice de clave principal del árbol B + generalmente necesita 1 ~ 3 veces. Sin embargo, el índice hash no admite la consulta de rango, lo que requiere que el motor juzgue la situación y cree un índice hash para los datos apropiados.无需人为干预


logo buffer: El búfer de registro, la parte de la memoria como el registro de rehacer está aquí, el tamaño predeterminado es 16M, los datos en la memoria se actualizarán en el disco a la frecuencia especificada, hay tres opciones. El primer tipo se comparte y se vacía en el disco cada 1 s; el segundo tipo se vacía en el disco después de confirmar la transacción, y el primer tipo también se usa al mismo tiempo. El tercero es que después de confirmar la transacción, se entregará a la página de caché del sistema, y ​​el sistema la actualizará en el disco en un momento específico, y el primer método también se usa al mismo tiempo.

parte del disco

inserte la descripción de la imagen aquí
La estructura del disco tiene principalmente las siguientes partes:

  • Espacio de tabla del sistema : espacio de tabla del sistema
    espacio de tabla del sistema puede tener uno o más archivos de datos. De forma predeterminada, se crea un archivo de datos ibdata1de .
    El espacio de tabla del sistema incluye diccionario de datos (incluidos los metadatos), búfer de escritura doble (sin área de almacenamiento después de la versión 8), búfer de cambio, registro de deshacer y datos e índices de tablas creadas en el espacio de tabla del sistema (no creadas en el espacio de tabla del sistema almacenado en un tablespace separado).

  • Espacios de tabla de archivo por tabla : espacio de tabla independiente
    Cada tabla utiliza un espacio de tabla independiente de forma predeterminada para almacenar datos e índices, correspondientes a un solo .idbarchivo en el disco

  • Espacios de tablas generales : el espacio de tablas general
    es un espacio de tablas compartido que puede almacenar varias tablas

  • Redo log
    Los dos bucles de Redo escriben archivos ib_logfile0 e ib_logfile1

hilo de fondo

Es el hilo que viaja entre la memoria y el disco, se programa en consecuencia y proporciona servicios de datos. Se
divide principalmente en Master Thread, IO Thread, Purge Thread,Page Cleaner Thread

El subproceso principal de fondo del subproceso maestro
es responsable de la programación de otros subprocesos, y también es responsable de la fusión buffer pooly change bufferfusión, el almacenamiento de páginas sucias, la recuperación de páginas de deshacer, etc.
IO Thread
inserte la descripción de la imagen aquí
Purge Thread
es principalmente para recuperar registros de deshacer después de la transacción envío, reduciendo la presión sobre la
página del subproceso maestro Subproceso más limpio
Vacíe los datos de la página sucia en la memoria al disco para reducir la presión sobre el subproceso maestro

Tres características principales de InnoDB

Las tres características principales del artículo recomendado
InnoDB son double write, Buffer pool, 自适应哈希索引
las dos últimas se han presentado anteriormente, y aquí solo se presenta el mecanismo de doble escritura.
¿Por qué se llama doble escritura? Debido a que una parte de los datos en la memoria se escribe primero 顺序en el búfer de doble escritura en el disco, después de confirmar que la escritura se realizó correctamente, los mismos datos en la memoria 离散se escriben en el espacio de tabla correspondiente.

¿Por qué hay un mecanismo de doble escritura?
Primero, hablemos de las desventajas del mecanismo de doble escritura: los mismos datos se escriben en el disco dos veces y se realiza una E/S adicional. Aunque se escribe secuencialmente, la E/S adicional reduce el rendimiento general en un 5-10%.
Hablemos de por qué se introdujo el mecanismo de doble escritura. La razón fundamental es resolver el problema de la corrupción de la página en el proceso de actualización de los datos de la memoria, es decir, 部分写问题
el problema de la corrupción de la página: el motor InnoDB utiliza las páginas como unidades, y el tamaño de cada página es de 16 K. El sistema operativo ( Linux) también usa páginas como unidades, pero su tamaño es de 4K, es decir, cuando los datos en la memoria quieren actualizarse en el disco, primero deben pasarse a la página del sistema operativo, y la página del sistema operativo se actualizará en el disco. Esto significa que cada vez que se actualiza una página de datos de memoria, debe escribirse en el sistema operativo cuatro veces. Sin embargo, si ocurre un accidente, como un tiempo de inactividad, durante estos 4 tiempos, se escribe en el disco una página incompleta en la memoria, lo que provoca daños en la página ( ) 部分写问题. En este momento, no se puede violar el principio de persistencia, entonces, ¿cómo recuperar los datos que no se escribieron correctamente en el disco debido al tiempo de inactividad, etc.?
En primer lugar, lo que pensé fue asegurarme de que los datos de la memoria se escriban en el disco y que haya un registro de rehacer. Pero, ¿qué se registra en el registro de rehacer? Es un registro físico, es decir, los datos de la dirección de la página xxx cuyo desplazamiento es xxx es xxxx, pero la página del registro que provocó el tiempo de inactividad no se escribió por completo y la página está dañada, lo que significa que el registro de 已经损坏!datos de la dirección de la página correspondiente tampoco es válida. Entonces , ¿rehacer no puede usar
binlog? La función de binlog es la copia de seguridad de datos y la replicación maestro-esclavo, no presta atención en absoluto a los datos de la memoria y del disco, es decir, no puede distinguir cuáles se han escrito en el disco y cuáles están en páginas sucias.
Si se realiza la recuperación completa, parece estar bien. Pero el costo es demasiado alto, no es realista.
En este momento, se introduce el mecanismo de doble escritura, es decir, las páginas registradas en el registro de redo no se operan primero, para evitar que la página registrada en el redo se dañe e invalide después de que ocurra un accidente durante el proceso de escritura. .
Entonces, ¿dónde escribir los datos primero? El lugar para escribir debe estar en el disco, de lo contrario no tiene sentido. Porque lo que hacemos es una copia de seguridad interactiva entre la memoria y el disco.
El motor InnoDB indica que la orden se escribe primero en el espacio de tabla del sistema y luego se escribe discretamente en el espacio de tabla independiente correspondiente después del éxito. InnoDB también optimiza la velocidad de escritura de escritura doble, porque escribir de esta manera es una escritura secuencial, se agrega una operación IO más y también se minimiza la pérdida de rendimiento causada por esto.
Lo anterior es por lo que la introducción双写机制


Archivo de escritura doble
Con este mecanismo, debe haber un archivo de almacenamiento correspondiente.
La caché de doble escritura tiene una parte compartida, una parte en la memoria y otra en el disco. Cada parte se fija en 2 M.
El búfer de doble escritura es de 128 páginas en el espacio de la tabla del disco, es decir, dos áreas con 1 M cada una, lo que hace un total de 2 M. Cuando se copian los datos del Buffer Pool, los datos deben copiarse primero en la parte de la memoria de la memoria caché de doble escritura, y luego la parte de la memoria se divide en dos veces, y el archivo de doble escritura de la parte del disco se escribe primero en el archivo de escritura doble con un tamaño de 1 M cada vez. Después de que la escritura sea exitosa, luego escriba discretamente los mismos datos en el espacio de tabla independiente correspondiente.


Cuando la memoria activa el mecanismo de checkponit, comienza a escribir algunas páginas en el disco. El proceso específico es el siguiente:

  1. Copie las páginas sucias para escribir en la memoria y cópielas en double writela parte de la memoria.
  2. La parte de la memoria de escritura doble se escribe en un área a la vez, es decir, 1M, y se escribe en la parte del espacio de tablas del sistema en dos órdenes.
  3. Después de confirmar que la escritura es exitosa, la parte de la memoria de doble escritura escribe discretamente los mismos datos en el espacio de tabla independiente correspondiente

¿Qué pasa si ocurre un accidente en el proceso de doble escritura?
Ocurre un accidente en la primera escritura: la primera vez es escribir los datos de la memoria (búfer de memoria de doble escritura) en el archivo de la tabla del sistema para hacer una copia de seguridad.
Si ocurre un accidente en este proceso, 但redo记载的页没有发生损坏puede usar rehacer para restaurar directamente
el segundo accidente en la segunda escritura: la segunda escritura es para escribir los datos de la memoria (búfer de memoria de doble escritura) en el espacio de tabla independiente correspondiente. Un
accidente al escribir en el disco hará que la página se dañe , y la página registrada en rehacer tampoco será válida en este momento. Pero con el archivo en el tablespace del sistema, cuando el sistema se está reiniciando, comprobará si la página de proceso está intacta. Si se encuentra que la página está dañada, se restaurará desde el tablespace del sistema. La página de rehacer es imposible de tener
. un accidente, porque solo después de que la página de rehacer se escribe con éxito, el negocio se considera completo.

Ejemplo: hay una tabla de usuarios, la identificación es la clave principal, el nombre es un índice común y la edad es un campo común. Cuando me conecto a MySQL y abro una transacción en la tabla de usuarios 修改y envío la edad del usuario cuyo nombre es 'zs' a 10, el proceso interno general de MySQL: la
capa de conexión de MySQL establece una conexión con el cliente y verifica la sintaxis y la semántica de la instrucción SQL Finalmente, entréguelo a la capa del motor. El motor que encontró esta tabla es el motor InnoDB. El motor InnoDB buscará al usuario cuyo nombre es 'zs' del Buffer Pool. Si no lo encuentra, usará el índice no agrupado para usar el nombre como el valor de índice para encontrar la identificación de esta fila de datos. La identificación va al índice agrupado para encontrar la página (en xxx.ibd文件中) donde se encuentra esta fila de datos, la carga en Buffer Pooly coloca un bloqueo de escritura, un bloqueo MDL, etc. fila (este proceso tiene un mecanismo MVCC para leer esta fila de datos). Al mismo tiempo, apunte el puntero del registro de deshacer en los datos al registro de deshacer antes de que se abra la transacción y abra un nuevo registro de deshacer al mismo tiempo. Luego cambie la edad a 10 en el Buffer Pool. En este momento, redo registra la modificación de los datos en la dirección del disco, deshace los registros de cómo restaurar la operación de registro original y binlog registra la operación de comando del usuario. Cuando se envía la transacción , redo y binlog inmediatamente El contenido del búfer se vacía en el disco y el deshacer se entrega al subproceso Purgar subproceso para su reciclaje. Sin embargo, los datos modificados en la memoria pueden no ser vaciados al disco.Cuando hay otros datos para leer, los datos en el Buffer Pool se devolverán directamente. Cuando la página sucia de estos datos active cheakPointel mecanismo, la página sucia se copiará del grupo de búfer al double writerbúfer de memoria, y los datos se escribirán en la tabla del sistema dos veces en la memoria.Escriba los datos en la memoria en la página correspondiente . Los registros del registro de rehacer correspondientes son inútiles y se sobrescribirán con nuevos datos.

Supongo que te gusta

Origin blog.csdn.net/m0_52889702/article/details/128359565
Recomendado
Clasificación