Principio subyacente de Mysql: me gustaría enseñarte mis habilidades para la vida

Cuanto más aprende, menos sabe.

1. Introducción

La base de datos es un lugar donde se almacenan los datos. Hay varios
formatos de almacenamiento diferentes . La capa inferior es el almacenamiento de página predeterminado de 16 kb. El nodo central del árbol b + puede almacenar muchos nodos hoja en una página. Depende del tamaño de Los datos son.
Importante: La capa inferior almacena la página de datos en el formato de un árbol b + (comprensión: la página de datos se encuentra en el árbol b +) Almacene los datos de fila de la lista vinculada en la página (comprenda: los 768 bytes de el valor de la columna de longitud variable en el encabezado de la fila se usa como índice. (Ponlo en otros) se
divide en bloques de datos y bloques de índice.
Al crear una tabla, se crea un índice de árbol b + en la base de datos con la clave primaria por predeterminado. Todos los datos se colocan en el nodo hoja, y la clave principal es la rama intermedia.
Al crear un índice En este momento, se coloca un nodo hoja de un árbol b + en el bloque de índice. El valor y la clave principal de esta columna están todos colocados

Motor de almacenamiento de base de datos: (el motor subyacente)

  • innoedb: admite transacciones, básicamente, la velocidad de lectura y escritura del motor predeterminado de mysql está bien (por qué) la clave primaria predeterminada es un índice agrupado
  • MyIsam: no admite la velocidad de escritura de transacciones, pero sí la velocidad de lectura rápida. El índice predeterminado es un índice no agrupado. Aunque se almacena en árboles b +, será lento al almacenar valores de escritura que no sean secuenciales. Busque el anterior
    ( ¿Es porque no se incrementa automáticamente como la clave principal? (El costo de la división del nodo hoja es mayor al insertarlo)

arquitectura mysql:
Inserte la descripción de la imagen aquí

Dos, caché:

Cuando llega una solicitud a la base de datos, lo primero que debe hacer es consultar la caché de mysql. La caché se divide en lo siguiente

  • Grupo de búfer: el caché en memoria de innodb, utilizado por el cliente para acceder a los datos de la capa de datos y la capa de índice en el disco duro, colocará estos datos en este búfer utiliza el algoritmo LRU para dar páginas antiguas en una proporción de 7: 3 eliminados
  • cambiar el búfer: la razón es porque el bloque de datos y el bloque de índice se almacenan en un archivo idb, y el índice secundario no se ordena, inserta o actualiza al azar. Es más lento actualizar los datos del índice cuando hay una
    inserción o Al actualizar, almacenar en caché estos datos en el grupo de búfer y luego escribir una serie de valores de índice en el bloque de índice cuando el sistema está inactivo o funcionando lentamente , lo que evita generar una gran cantidad de accesos de E / S aleatorios en el disco para obtener páginas de índice normales .
  • búfer de registro: el búfer de registro se utiliza para guardar archivos de registro que se escribirán en el disco. Hay varios niveles diferentes que se pueden configurar mediante innodb_flush_log_at_trx_commit
    1. Una vez confirmada la transacción, solo se escribe en el búfer de registro y luego se vacía en la caché cada segundo y luego se actualiza en el disco.
    2. Actualice el registro en el disco después de que se confirme la transacción
    3. Una vez confirmada la transacción, se escribe en la página carsh y luego se actualiza en el disco cada segundo

En tercer lugar, índice (proporciona una búsqueda más rápida de los datos almacenados en el disco duro para brindar comodidad):

3.1 Estructura de almacenamiento de índices:

  • Tabla hash: una de las características más importantes del hash es que la búsqueda es muy rápida a cambio de espacio por tiempo. Básicamente, si se agrega un campo con un índice hash = esto es más conveniente de usar porque no se almacena secuencialmente, por lo que la consulta de rango no toma el índice.
  • Árbol B: es el árbol binario más el algoritmo de equilibrio que todos los nodos almacenan una palabra clave
  • Árbol B +: La capa inferior del árbol es un árbol binario. Esto es básicamente una dicotomía de encontrar. Esto es muy rápido.
1. 中间节点只保存下个节点的引用 不存放数据 所有的数据都存放在叶子节点中  
2. 叶子节点 之间是以链表链接的  这样可以用作范围查询非常快  
3. 所有中间节点都在子节点中 是子节点中的最大或者最小 

3.2 Tipo de índice:

  • Índice único: si una columna de datos tiene un índice único, sus datos no se pueden repetir. Cada uno es único.
  • Índice de clave principal: solo puede haber un índice de clave principal en una tabla. El índice de clave principal no se puede repetir y el único no puede estar vacío.
  • Índice conjunto: coloque algunas columnas en un índice. Si hay tres (a, b, c), cree a (a, b) (a, b, c). Siga el principio de la izquierda. Si solo marca b , no toma el índice. Pero compruebe que a esté indexado
  • Índice agrupado: de hecho, es el índice de clave principal anterior (tal vez diferente del índice es que está almacenado en el bloque de datos) porque solo hay uno, por lo que cuando establece el índice de clave principal, se establece en agrupado índice de forma predeterminada. En este momento, todos los campos y la clave principal se colocan en este nodo hoja

3.3 Principio de búsqueda:

select * from user where name = '' and age > 15 and age < 30;  
 hash 表: 将name hash 然后直接找  
 B 树 : 查询 age 等于15 的 然后中序遍历 找到结尾 比较耗时  
 B+ 树: 查询age 等于15 的叶子节点 然后通过叶子链表 直接找到最大数   
 user表  id  name  age  height       id 主键索引   (name,age) 联合索引
 select height from user where name = '张三';       
 这个时候 条件name 是有索引的时候(去索引块里面查询对应的值) 查询到叶子节点上面的值name和id 没有height 这个时候回表查询(去数据块里面根据id)根据id走聚集索引 
 查询到所有的数据将height 返回 

Cuatro, almacenamiento

Descripción de las extensiones de archivo involucradas en el almacenamiento:

  • frm: Por lo general, la información de estructura de esta tabla se almacenará en este lugar después de crear una tabla.
  • idb: después de crear la tabla, los datos y los índices de la tabla deberían existir en este lugar.
  • iddata: archivo del espacio de tabla del sistema

4.1 Espacio de mesa:

  • Espacio de tabla del sistema: antes de 5.7 todos los archivos de datos se colocan en el espacio de tabla del sistema
  • Espacio de tabla independiente: se introdujo después de 5.7 Todas las tablas creadas por los propios usuarios se almacenan en los datos del espacio de tabla independiente utilizando ese idb.
    • La desventaja es que cada mesa asigna el tamaño primero y no se pueden disfrutar otras mesas. Esto puede causar una pérdida de espacio.
  • Espacio de tabla general: un espacio de tabla general es para almacenar tablas o datos compartidos, que pueden almacenar datos de varias tablas
  • Undo tablespace: como su nombre lo indica, se coloca undo log. Undo log se puede almacenar en uno o más Undo tablespaces en lugar del tablespace del sistema.
  • Espacio de tabla temporal: se crea cuando se inicia el servicio y se destruye cuando se cierra. Generalmente se utiliza cuando se crea una tabla temporal durante consultas relacionadas con UNION.

4.2 estructura de archivos idb

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-qDis4iDZ-1611556632291) (../ image / mysql database storage.png)]

  • Almacenamiento de la página: Es una unidad más pequeña que el final y el área y la unidad más pequeña de almacenamiento de mysql. El formato de datos específico se puede ver en la imagen. Hay muchas filas en el medio.
  • Almacenamiento de filas: los datos de almacenamiento de filas se colocan en el medio, pero el almacenamiento de filas parece tener los modos de fila COMPACTO y DINÁMICO. El
    almacenamiento de filas puede tener hasta 65535 bytes. Si el juego de caracteres es UTF-8, un carácter son tres bytes, por lo que será menos.

5. Registro

Los registros son una parte muy importante de mysql. Si queremos entender los registros, primero debemos aclarar el lado del servidor y el lado del motor de almacenamiento de la arquitectura anterior . Al actualizar un dato, el proceso de registro es así.

1. El ejecutor encuentra los datos del motor, si se devuelven directamente en la memoria, si no están en la memoria, la consulta devuelve
2. Después de que el ejecutor obtiene los datos, primero modificará los datos y luego llamará la interfaz del motor para reescribir los datos
3. El motor escribe los datos Actualizar en la memoria, el colega escribe datos en el registro de rehacer. En este momento, está en la etapa de preparación y se notifica al ejecutor que la ejecución se completó, y puede ser operado en cualquier momento
4. El ejecutor genera el bin log de esta operación y llama a la interfaz de envío de transacciones del motor
5. Engine Cambia la fase de preparación del registro de rehacer que se acaba de escribir en la fase de confirmación, y la actualización Esta completo

5.1. Archivos de registro del motor de almacenamiento de registros Rehacer:

Vernáculo: Para mejorar el rendimiento de cada modificación, no modificará el disco, por lo que los retrasará en la zona de amortiguación, pero la inseguridad habrá un proceso en segundo plano para ejecutar el registro de rehacer que se mantuvo en el disco para la reparación de fallas
se usa principalmente para datos recuperación, todas las operaciones de modificación y eliminación se registrarán aquí. Hay dos punteros para la escritura circular. Estos son los
datos escritos en el disco antes de que el binlog no se confirme , de modo que pueda encontrarlos para escribir cuando se restaure la falla. La recuperación de fallos para binlog no enviado se compone de dos pasos

  • Búfer de registro de rehacer el búfer de registro se encuentra en la estructura de la memoria y no en la estructura del disco
  • El archivo de registro de rehacer está en la estructura de disco id_logfile1 id_logfile2

5.2, archivo de registro del servidor de registro bin

En la lengua vernácula: escriba toda la lógica en un archivo binario en forma de anexo. Es
un archivo binario que registra todos los cambios y se usa principalmente para registrar puntos de tiempo. SQL se actualiza y elimina. Se usa principalmente

  1. El servidor maestro de sincronización maestro-esclavo envía esto al servidor esclavo
  2. La sincronización desde el servidor también se puede utilizar para restaurar

5.3, deshacer registro El registro de reversión del motor de almacenamiento

En la lengua vernácula: Almacene los datos modificados y el número de versión en el archivo de encabezado de los datos para que, si ocurre un error, se pueda deshacer directamente.
Cuando la transacción no se confirma, cada ejecución de SQL generará un registro de deshacer y lo colocará en el DATA_ROLL_PTR del registro de fila. Si se elimina Se coloca directamente en la información del encabezado del registro de fila y se marca como eliminado. Cuando
se confirma la transacción, se elimina el registro de deshacer

5.4 ¿Cuál es la diferencia entre rehacer log y bin log?

1. Redo Log es exclusivo del motor InnoDB, y binlog está implementado por la capa MySQL Server, se pueden utilizar todos los motores.
2. Los archivos de Rehacer Log se escriben cíclicamente, el espacio se agotará y el registro binlog se escribirá adicionalmente y no sobrescribirá el registro anterior.
3.Redo log es un registro físico, que registra qué operaciones se realizan en una determinada página de datos, y bin log es un registro lógico, que registra la lógica original de esta declaración

Seis, asuntos

El principio de las transacciones se logra a través de logs y locks , el más importante de los cuales es la consistencia, y los otros tres son para la consistencia final.

6.1 Características de la transacción

  • Atomicidad: un grupo de transacciones tiene éxito o falla al mismo tiempo, el principio es deshacer la reversión del registro si falla
  • Aislamiento: Cuatro niveles de aislamiento se definen como una compensación entre confiabilidad y desempeño. El nivel de aislamiento predeterminado es de lectura repetible. El principio es usar bloqueos para asegurar que los datos no sean cambiados por otras transacciones.
  • Persistencia: Una vez que la transacción está comprometida, se guardará permanentemente en la base de datos sin cortes de energía. El principio es que la transacción se sincroniza con el disco a través del registro de rehacer tras el compromiso, por lo que se realiza a través del registro de rehacer.
  • Consistencia: una transacción siempre se transfiere de un estado de consistencia a otro estado de consistencia, por ejemplo, comienza con A + B 5000 y termina con A + B 5000 independientemente de cómo se realice la transferencia. Se completa con atomicidad, aislamiento y durabilidad. .

6.2 Nivel de aislamiento de transacciones

En el registro de deshacer anterior, este registro se genera en el registro de la fila cuando la transacción no se confirma, pero cuando se operan varias transacciones juntas, habrá varios tipos de transacciones simultáneas.

  • Leer sin confirmar: significa que una transacción puede leer los datos de otra transacción sin confirmar.
  • Lectura confirmada: significa que una transacción debe esperar hasta que se confirme otra transacción para leer datos.
  • Lectura repetible: Cuando se abre esta transacción, otras transacciones no pueden modificar datos. Otras se pueden leer pero no modificar. Generalmente, se agregan bloqueos de fila.
  • SERLALIZABLE (Serializable): No importa cuántas transacciones, todas las subtransacciones de una transacción se pueden ejecutar después de que todas las subtransacciones de una transacción se ejecuten una por una.

6.3 Bloqueo de transacciones

  • Bloqueo compartido (bloqueo de lectura): agregue bloqueo en modo compartir después de sql. Después de agregar este bloqueo, se pueden leer otros bloqueos compartidos y no se permiten otros bloqueos exclusivos;
  • Bloqueo exclusivo (bloqueo de escritura): sql va seguido de para la actualización. Después de agregar un bloqueo exclusivo, otras transacciones no pueden usar bloqueos de lectura o de escritura.
    Los bloqueos exclusivos se dividen en bloqueos de fila y bloqueos de tabla. Los bloqueos de fila bloquean esta fila. Los bloqueos de tabla son Bloqueado Leer y escribir operaciones de otros usuarios de toda la tabla.

P: ¿Cómo se puede lograr una lectura repetible?

La lectura repetible significa que los datos leídos varias veces son iguales. Hay dos formas de realizarlo, una es a través del bloqueo de lectura y la otra es a través de MVCC
Inserte la descripción de la imagen aquí

¿Por qué puede ser repetible? Mientras no se libere el bloqueo de lectura, los datos leídos por primera vez aún se pueden leer durante la segunda lectura.

  • Ventajas: simple de implementar

  • Desventajas: incapaz de lograr lectura y escritura paralelas
    Inserte la descripción de la imagen aquí

    ¿Por qué puede ser repetible? Debido a que las lecturas múltiples generan solo una versión, los mismos datos se leen naturalmente.

  • Ventajas: lectura y escritura paralelas

  • Desventajas: alta complejidad de implementación

P: ¿Dos cosas operan en el mismo registro?

En este momento, depende de si se lee o escribe. Si se lee, ambas cosas leen los datos antes de la instantánea. Si se cambia, esta fila se bloqueará y la transacción se podrá operar después de que la otra sea presentada.

Cómo escribir una declaración para la actualización de sql t set a = 10 donde id = 1;
primero puede vincular al cliente mysql a través de la arquitectura del motor innodb para verificar el nombre de usuario y la contraseña de la caché de consulta si hay una identificación de 1 que no presione el caché (cada consulta Después de eso, los datos anteriores se colocarán en el
grupo de búfer). Analizador -> Optimizador -> ejecutor y luego el motor subyacente interactúa con
la base de datos. Este lugar se compara con el motor de búsqueda innodb que consulta primero el id 1 después de encontrarlo Establezca a en 10, llame a la interfaz de escritura para actualizar los datos en el registro de rehacer de la memoria y
registre un registro en el registro del contenedor, y luego llame a la interfaz de transacciones para escribir los datos en el disco

P: ¿Por qué no seleccionar * consulta

En primer lugar, el uso de consultas select * para una gran cantidad de datos innecesarios causados ​​por la congestión de la red io
siguió mysql es un sistema de memoria de 16kb tiene una lectura de 4k, toda esta consulta podría leerse varias veces el

P: ¿Cuál es la diferencia entre varchar y char, por qué usar varchar (255) y cuál es la longitud máxima de varchar ()?

La longitud máxima de VARCHAR = (el tamaño máximo de fila, el número de bytes ocupados por la columna de identificación NULL, el número de bytes para la identificación de longitud) / el número máximo de bytes para un solo carácter en un juego de caracteres
varcchar es una cadena de longitud variable que no se completará si excede la longitud almacenada La longitud
se almacena en el número de dígitos en un byte. Char es una cadena. Si excede la longitud almacenada, se llena con espacios. La
longitud máxima de cada línea es 65535 bytes.
Si se usa el modo de línea, se usa compact. 768 Si el byte se usa como índice, debe colocarse en

P: ¿Cómo almacena mysql campos grandes? ¿Por qué varchar () usa 255?

En el modo de fila COMPACTO, para el almacenamiento de campos grandes, los primeros 768 campos se colocan en el registro de la página de índice y las otras partes están separadas por 20 bytes para señalar la posición restante.
Sin embargo, un carácter tiene 3 bytes, por lo que se divide por 3 es 256 Un byte es la longitud de almacenamiento
El segundo argumento es que más de 256 bytes requieren dos bytes para almacenar la longitud, por lo que es básicamente 255, lo que ahorra un poco de memoria.

P: ¿Sabe qué es el índice de cobertura y la tabla de retorno?

Cuando consulta una declaración, los campos que necesita para la consulta están todos en este índice, luego llámelo índice de cobertura. En este momento, no es necesario que regrese a la tabla para realizar la consulta. Si no incluye todos, debe pasar el índice agrupado de acuerdo con la consulta de mesa redonda de id.

P: ¿Qué sabes sobre los bloqueos de mysql?

Bloqueo de lectura y escritura

P: ¿Qué tamaño tienen sus datos? ¿Cómo hacer una subtabla de sub-base de datos?

Cuando la cantidad de datos en una tabla es grande, definitivamente considerará subtablas. Generalmente, la tabla se divide en tablas por período de tiempo y subcampos (agregue algunos campos grandes a otra tabla). Si la consulta cruza la tabla se combina Consulta de tabla intermedia

P: ¿Cómo asegurar una identificación única después de la subtabla?

La identificación es un servicio generalmente distribuido que garantiza que un algoritmo de nieve único también puede especificar un campo de identificación único en cada tabla, como el número de pedido como clave principal

P: ¿Por qué myisam lee más rápido que innodb?

Si se trata de una búsqueda de clave no primaria, Innodb la encuentra y necesita volver a la tabla para buscar, pero el nodo hoja directo de myisam está desplazado. La dirección física directa es más rápida. Innodb admite transacciones. También es una razón para mantener mvvc.

P: count (1) count (*) count (id) count (field) que es más rápido

Count (1) y count (*) Estos dos son iguales para obtener el valor en la columna, pero para contar count (id), toma el id de esta columna si el valor no está vacío, count count (campo) Encuentra de acuerdo a este campo Si este campo no está vacío, cuente la
comparación de eficiencia de ejecución: recuento (campo) <recuento (clave primaria) <recuento (1)

P: ¿Hay más índices, mejor? ¿Por qué existen estándares para la indexación?

Cuando hay demasiados índices, la consulta y la actualización se ralentizarán. Si el índice de la clave principal no es regular, el índice se puede reorganizar en cada actualización e inserción, por lo que generalmente el índice no debe exceder ocho

Supongo que te gusta

Origin blog.csdn.net/hgdzw/article/details/113111945
Recomendado
Clasificación