Índice MySql, bloqueo, transacción, debes conocer los puntos

1. Índice

Index, similar al catálogo de libros, puede encontrar el contenido correspondiente inmediatamente según un cierto número de página del catálogo.

Ventajas de los índices: 1. Ordenado naturalmente. 2. Búsqueda rápida.
Desventajas del índice: 1. Ocupa espacio. 2. Reducir la velocidad de actualización de tablas.

Nota: Las tablas pequeñas utilizan escaneos completos de tablas más rápido, y las tablas medianas y grandes utilizan índices. El índice de la tabla supergrande no es básicamente válido.

En términos de implementación, el índice se divide en dos tipos: índice agrupado e índice auxiliar (también llamado índice secundario o índice no agrupado)

Funcionalmente, hay 6 tipos: índice ordinario, índice único, índice de clave principal, índice compuesto, índice de clave externa e índice de texto completo.

Habla sobre 6 tipos de índices en detalle:

1. Índice ordinario: el índice más básico sin restricciones.
2. Índice único: similar al índice ordinario, pero con restricciones únicas.
3. Índice de clave primaria: un índice único especial, no se permiten valores nulos .
4. Índice compuesto: combine varias columnas para crear un índice, que puede cubrir varias columnas.
5. Índice de clave externa: solo las tablas de tipo InnoDB pueden utilizar el índice de clave externa para garantizar la coherencia e integridad de los datos y realizar operaciones en cascada.
6. Indexación de texto completo: la propia indexación de texto completo de MySQL solo se puede usar para InnoDB, MyISAM, y solo se puede usar para búsquedas de texto completo en inglés, generalmente se usa el motor de indexación de texto completo (ES, Solr).

  • 注意:主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空。

Además, InnoDB agrupa los datos a través de la clave principal. Si la clave principal no está definida y el índice agrupado no está definido, MySql elegirá un índice único no vacío en su lugar. Si no existe tal índice, definirá implícitamente una clave principal de 6 bytes como índice agrupado. , Los usuarios no pueden ver ni acceder.

Simplemente pon:

  1. Cuando se establece la clave principal, se genera automáticamente un índice único. Si no hay un índice agrupado antes , entonces la clave principal es un índice agrupado.
  2. Cuando no se establece la clave primaria, se seleccionará un índice único que no está vacío como índice agrupado. Si no lo está, se generará un índice implícito de 6 bytes.

MySql almacena datos de acuerdo con las páginas. La página predeterminada es de 16 kb. Cuando realiza una consulta, no solo cargará una determinada pieza de datos, sino que cargará la página donde se encuentran los datos en el pageCache. En realidad, esto es lo mismo que el principio de acceso cercano del sistema operativo. similar.

El índice MySql utiliza una estructura de árbol B +. Antes de hablar del árbol B +, hablemos del árbol B. El árbol B es un árbol de búsqueda equilibrado de múltiples direcciones. Comparado con el árbol binario ordinario, no será extremadamente desequilibrado y también es de múltiples direcciones.

La característica del árbol B es que también almacenará datos en nodos secundarios que no son páginas.

Mira la foto para ver:

Y esta característica hará que los nodos secundarios que no sean de página no puedan almacenar una gran cantidad de índices.

Y B + Tree está optimizado para esto. Como se muestra abajo:

Vemos que B + Tree guarda todos los datos en los nodos hoja, y los nodos no secundarios solo guardan el índice y el puntero.

Suponemos que un nodo secundario que no es de página es de 16 kb, cada índice, es decir, la clave principal es bigint, que es 8b, y el puntero es 8b. Entonces, cada página puede almacenar alrededor de 1000 índices (16kb / 8b + 8b).

¿Y cuántos índices puede almacenar un árbol B + de 3 niveles? Como se muestra abajo:

Se pueden almacenar aproximadamente mil millones de índices. Por lo general, la altura del árbol B + es de 2 a 4. Debido a que MySql se está ejecutando, el nodo raíz reside en la memoria, por lo que cada búsqueda solo necesita aproximadamente 2-3 veces de IO. Se puede decir que el diseño del árbol B + se basa en las características del disco mecánico.

Conociendo el diseño del índice, podemos conocer alguna otra información:

  1. La clave principal de MySql no puede ser demasiado grande. Si se usa UUID, los nodos que no sean hojas del árbol B + se desperdiciarán.
  2. Es mejor que la clave principal de MySql se incremente automáticamente. Si usa UUID, el árbol B + se ajustará cada vez que lo inserte, lo que provocará divisiones de página y afectará seriamente el rendimiento.

Entonces, si se utilizan sub-bases de datos y tablas en el proyecto, generalmente necesitamos una clave principal para la fragmentación, ¿qué debemos hacer? En términos de implementación, podemos mantener la clave primaria autoincrementada, y la clave primaria lógica se puede utilizar como índice único.

2. Mecanismo de bloqueo

Respecto a las cerraduras Mysql, se van a desprender varios conceptos, de hecho, las cerraduras tienen varias dimensiones, vamos a explicarlas.

1. Tipo dimensión
  • Bloqueo compartido (bloqueo de lectura / bloqueo S)

  • Bloqueo exclusivo (bloqueo de escritura / bloqueo X)

    Desglose por tipo:

    • Bloqueo de intención compartida
    • Bloqueo de intención exclusiva (mutuamente excluyente)
  • Bloqueo pesimista (usar bloqueo, es decir, para actualizar)

  • Bloqueo optimista (utilizando el campo de número de versión, similar al mecanismo CAS, es decir, el usuario se controla a sí mismo. Desventajas: cuando la concurrencia es alta, hay muchos reintentos inútiles)

2. Bloquear granularidad (dimensión de granularidad)
  • Bloqueo de mesa
  • Bloqueo de página (motor Mysql BerkeleyDB)
  • Bloqueo de fila (InnoDB)
3. Algoritmo de bloqueo (dimensión del algoritmo)
  • Bloqueo de registro (registro de una sola línea)
  • Gap Lock (bloqueo de espacio, bloquea un rango, pero no incluye registros bloqueados)
  • Bloqueo de tecla siguiente (Bloqueo de registro + Bloqueo de espacio, bloquea un rango y bloquea el registro en sí, MySql evita la lectura fantasma, que se implementa con este bloqueo)
4. ¿Está bloqueada la operación de lectura predeterminada?
  • El valor predeterminado es el mecanismo MVCC ("lectura coherente sin bloqueo") para garantizar la corrección del aislamiento en el nivel RR y no está bloqueado.

Puede optar por bloquear manualmente: seleccione xxxx para actualizar (bloqueo exclusivo), seleccione bloqueo xxxx en modo compartir (bloqueo compartido), que se denomina "lectura de bloqueo consistente".

Después de usar el candado, puede evitar las lecturas fantasmas en el nivel RR. Por supuesto, la lectura MVCC predeterminada también puede evitar la lectura fantasma.

Dado que RR puede prevenir la lectura fantasma, entonces, ¿para qué sirve SERIALIZABLE?

Evite la pérdida de actualizaciones. Por ejemplo:

En este momento, debemos usar el nivel SERIALIZABLE para lectura en serie.

Finalmente, el principio de implementación del bloqueo de fila es bloquear el índice agrupado. Si no acierta el índice correctamente cuando realiza una consulta, el optimizador MySql abandonará el bloqueo de fila y utilizará el bloqueo de tabla.

3. Asuntos

La transacción es el tema eterno de la base de datos, ACID: Atomicidad, consistencia, aislamiento, durabilidad.

La más importante de las cuatro características es la coherencia. La consistencia está garantizada por atomicidad, aislamiento y durabilidad.

  • La atomicidad está garantizada por Undo log. Deshacer el registro guarda el registro antes de cada cambio, de modo que se pueda deshacer cuando se produzca un error.
  • El aislamiento está garantizado por MVCC y Lock. Dicho más tarde.
  • La durabilidad está garantizada por Redo Log. Cada vez que se modifiquen los datos, el registro se escribirá en el registro de rehacer. Solo cuando el registro de rehacer se escriba correctamente, se escribirá en el árbol B +. Si se corta la energía antes del envío, el registro se puede restaurar a través del registro de rehacer.

Luego hable sobre el aislamiento.

Nivel de aislamiento:

  1. Lectura no confirmada (RU)
  2. Lectura enviada (RC)
  3. Lectura repetible (RR)
  4. Serializable

Cada nivel resolverá diferentes problemas, generalmente 3 problemas: lectura sucia, lectura no repetible, lectura fantasma. Una imagen clásica:

Aquí hay una nota. Con respecto a la lectura fantasma, en la especificación de la base de datos, el nivel RR causará lectura fantasma. Sin embargo, debido a la optimización de Mysql, el nivel RR de MySql no causará lectura fantasma: Cuando se usa la selección predeterminada, MySql usa el mecanismo MVCC Se garantiza que no habrá lecturas fantasmas; también puede usar bloqueos. Cuando se usan bloqueos, como para actualizar (bloqueo X), bloqueo en modo compartir (bloqueo S), MySql usará el bloqueo de tecla siguiente para asegurarse de que no se produzcan lecturas fantasmas. El primero se denomina lectura instantánea y el segundo, lectura actual.

Análisis de principio:

  • Razones para las lecturas sucias de RU: el principio de RU es bloquear los registros de fila de cada instrucción de actualización, en lugar de bloquear toda la transacción, por lo que se producirán lecturas sucias. El RC y RR bloquearán toda la transacción.
  • La razón por la que RC no puede leer repetidamente: RC genera una nueva Vista de lectura cada vez que se ejecuta una instrucción SQL, y la vista de lectura es diferente cada vez. La transacción RR usa la misma vista de lectura de principio a fin.
  • La razón por la que RR no ocurre lectura fantasma: lo he dicho arriba.

¿Cuál es la diferencia entre RR y Serializble? Respuesta: Actualización perdida. Se ha mencionado la parte de este artículo sobre cerraduras.

Introducción de MVCC: control de concurrencia de múltiples versiones de nombre completo.

InnoDB cada índice agrupado tiene 4 campos ocultos, que son la clave principal (RowID), el ID de transacción del cambio más reciente (núcleo MVCC), el puntero de Undo Log (núcleo aislado) y la marca de eliminación del índice (cuando se elimina, no se eliminará inmediatamente , Pero márquelo y elimínelo de forma asincrónica);

Esencialmente, MVCC se realiza con la lista enlazada Undo Log.

La implementación de MVCC: la transacción modifica los datos originales en un modo de bloqueo exclusivo, almacena los datos modificados en el registro de deshacer y asocia los datos con el puntero de reversión. Si la modificación es exitosa, no se hace nada. Si falla la modificación, se restaura el Deshacer. Datos en el registro.

Una cosa más, solemos pensar que MVCC es similar al bloqueo optimista, es decir, usar el número de versión, de hecho, innoDB no implementa esto. Por supuesto, esto no afecta nuestro uso de MySql.

Supongo que te gusta

Origin blog.csdn.net/doubututou/article/details/109112309
Recomendado
Clasificación