[Notas de la clase MySQL 45]

Conferencia 1: ¿Cómo se ejecuta una declaración de consulta SQL?

  • Conector: después de completar el protocolo de enlace TCP clásico, comience a autenticar la identidad y verificar los permisos.
  • Analizadores: análisis léxico y análisis de sintaxis.
  • Optimizador: qué índice usar, el orden de conexión de cada tabla
  • Ejecutor: llame a la interfaz del motor para obtener datos, determine si cumple con las condiciones y coloque aquellos que cumplan con las condiciones en el conjunto de resultados.
  • Motor de almacenamiento: interactúa con el disco, obtiene datos y los devuelve al ejecutor.

Conferencia 2: ¿Cómo se ejecuta una declaración de actualización de SQL?

两个重要日志

  • registro bin: capa de servidor, escritura adjunta, declaración SQL de actualización de registros
  • Rehacer registro: motor de almacenamiento, sobrescritura, registro de datos de actualización

更新过程

  • rehacer registro - preparar: actualizar registros de datos en la memoria
  • registro bin: las declaraciones de actualización se registran en el disco
  • rehacer registro - confirmar: actualizar los datos grabados en el disco

Conferencia 3: Aislamiento de transacciones, por qué todavía no puedo verlo después de que lo cambiaste

事务执行语句

  • Declaraciones de inicio de transacción: comenzar, iniciar transacción
  • Declaración de confirmación de transacción: compromiso
  • Declaración de reversión de transacción: reversión
  • La confirmación automática está desactivada: establezca la confirmación automática = 0

Conferencia 4: Comprender la indexación en términos simples (Parte 1)

创建索引语句

create table T(
	id int primary key,
	k int not null,
	name varchar(16),
	index(k)
)engine = InnoDB;

主键索引和普通索引的区别

  • No es necesario devolver el índice de clave principal a la tabla. Si el índice ordinario no cubre el índice, es necesario devolver la tabla.

Conferencia 5: Explica el índice en términos simples (Parte 2)

几个重要的概念

  • Índice de cobertura: si el índice ordinario es un índice de cobertura, no es necesario devolver la tabla
  • Principio del prefijo más a la izquierda: varios campos en el índice son de izquierda a derecha y el contenido de los campos también es de derecha a derecha.
  • Despliegue de índice: puede reducir el número de retornos de la tabla

Conferencia 6: Bloqueos globales y bloqueos de tabla ¿Por qué hay tantos obstáculos al agregar un campo a una tabla?

全局锁

  • Comando de bloqueo de lectura global: vaciar tablas con bloqueo de lectura
  • Escenario de uso típico: copia de seguridad lógica de base de datos completa

表级锁

  • Bloqueo de tabla (bloqueo de datos): bloquear tablas t1 lectura, t2 escritura; (bloquear), desbloquear tabla; (desbloquear)
  • Bloqueo de metadatos MDL (bloqueo de estructura de tabla): no es necesario usarlo explícitamente, se agregará automáticamente al acceder a una tabla

行级锁

  • Los bloqueos a nivel de fila de MySQL los implementa cada motor en la capa del motor, pero no todos los motores admiten bloqueos de fila.

Conferencia 7: ¿Cuáles son las ventajas y desventajas de los bloqueos de fila? ¿Cómo reducir el impacto de los bloqueos de fila en el rendimiento?

重要概念

  • Bloqueo de dos etapas: etapa de bloqueo y etapa de desbloqueo
  • Punto muerto: el bloqueo de dos fases puede provocar un punto muerto

死锁解决

  • Establecer tiempo de espera de punto muerto: innodb_lock_wait_timeout = 50
  • Establecer detección de interbloqueo: innodb_deadlock_detect = activado
  • Controlar la concurrencia: controlar la cantidad de subprocesos que operan la misma fila de datos
  • Cambie una línea a varias líneas lógicas para reducir los conflictos de bloqueo

Conferencia 8: ¿Las transacciones están aisladas o no?

两种读

  • Lectura actual: lea los últimos datos enviados
  • Lectura consistente: lee datos siguiendo el mecanismo de aislamiento.

不同操作的隔离机制

  • Operación de actualización: lectura confirmada (lectura actual)
  • Operación de consulta: lectura repetible (lectura consistente)

思考一下为什么?
La transacción B encuentra que el valor de K es 3 y la transacción A encuentra que el valor de K es 1
Insertar descripción de la imagen aquí

Conferencia 9: ¿Cómo elegir entre índice ordinario e índice único?

Debido a que es posible que la operación de actualización de un índice único no utilice el búfer de cambio, generalmente se recomienda elegir un índice normal.

Conferencia 10: ¿Por qué MySQL a veces elige el índice incorrecto?

查询索引信息

  • Instrucción: mostrar índice de nombre_tabla;

影响索引选择的因素

  • Número de filas escaneadas: priorice los índices con un número menor de filas escaneadas
  • Discriminación: cuanto mayor es la discriminación, menor es el número de líneas de escaneo.
  • Devolución de tabla: si el rendimiento consumido por el índice ordinario + retorno de tabla es mayor que el de la consulta de tabla completa, provocará una falla en el índice.
  • Clasificación de campos:

索引选择错误的解决办法

  • Ejecutar comando de corrección: analizar tabla t;
  • Forzar el uso de índices: seleccione * de t force(a) donde…
  • Guía para usar el índice: ordenar por b se convierte en ordenar por b,a
  • Eliminar índices mal utilizados

Conferencia 11: ¿Cómo indexar un campo de cadena?

  • Ejemplo: alterar tabla usuario agregar índice index_email(email6));
  • Principio: compensación entre distinción y longitud del índice

Conferencia 12: ¿Por qué mi MySQL "tiembla"?

主要分为两种场景,导致MySQL突然抖一下

  • El registro de rehacer está lleno y es necesario actualizar la memoria del registro de rehacer (el registro se vuelve a escribir en el disco)
  • El grupo de búfer no es suficiente, las páginas sucias deben escribirse primero en el disco (las páginas de datos se vuelven a escribir en el disco).

InnoDB刷脏页的控制策略

  • Factores que afectan la capacidad de InnoDB para eliminar páginas sucias: proporción de páginas sucias, velocidad de escritura del registro de rehacer
  • Puede obtener las IOPS del disco a través del comando y luego configurar innodb_io_capacity de InnoDB en IOPS
  • La velocidad real de vaciado del disco de InnoDB se calcula internamente mediante un R% y luego se multiplica por innode_io_capacity, que es la velocidad de vaciado del disco.

Conferencia 13: ¿Por qué el tamaño del archivo de la tabla no cambia cuando se elimina la mitad de los datos de la tabla?

  • El comando de eliminación en realidad simplemente marca la ubicación grabada o la página de datos como "reutilizable", pero el tamaño del archivo del disco no cambiará. En otras palabras, el espacio de tabla no se puede recuperar mediante el comando de eliminación. Estos se pueden reutilizar, pero el espacio no utilizado parece "vacío".

Conferencia 14: el conteo (*) es muy lento, ¿qué debo hacer?

  • A medida que aumenta la cantidad de registros en el sistema, seleccione count(*) de table_name se ejecutará cada vez más lento.
  • Puede utilizar caché y tablas de datos para almacenar el valor de count(*)
  • Rendimiento de diferentes recuentos: recuento (campo) < recuento (id de clave principal) < recuento (1) ≈ recuento (*)

Conferencia 16: ¿Cómo funciona el orden por orden?

select city, name, age from T where city = '杭州' order by name limit 1000;

  • Clasificación de campo completo: extraiga toda la fila de datos, luego tome ciudad, nombre, edad y colóquelos en sort_buffer para ordenar, no es necesario volver a la tabla
  • Clasificación por ID de fila: extraiga toda la fila de datos, coloque algunos campos en sort_buffer para ordenar y debe volver a la tabla
  • Si (ciudad, nombre) es un índice, entonces el orden anterior no requiere clasificación.

Conferencia 17: ¿Por qué se ejecuta tan lentamente cuando solo reviso una línea de declaraciones?

select * from table where id = 1

  • Esperando liberación de bloqueo (bloqueo MDL, bloqueo de fila)
  • Espere a que se vacíe para actualizar el disco

select * from table where c = 50000 limit 1

  • Consulta lenta: escaneo completo de la tabla,
  • Transacción: Deshacer causado por lecturas consistentes muchas veces, la lectura actual lee directamente el último valor

Supongo que te gusta

Origin blog.csdn.net/m0_46638350/article/details/132148688
Recomendado
Clasificación