Ajuste del rendimiento de mysql (9)

Prefacio

  En el artículo anterior, presentamos la optimización de aplicaciones , la optimización de la caché de consultas en mysql, la optimización de la gestión de memoria en mysql y el ajuste de parámetros de concurrencia en mysql. A continuación, presentaremos los bloqueos en MySQL, incluida la contención de bloqueos y el contenido relacionado de bloqueos de fila y bloqueos de tabla. Además, presentaremos algunas técnicas de uso común en SQL. Primero, presentaremos el contenido relacionado de bloqueos.

Uno, bloqueo MySQL

1. Descripción general de las cerraduras

  El bloqueo es un mecanismo de recursos determinado por el que la computadora coordina el acceso simultáneo mediante múltiples procesos o subprocesos. En la base de datos, además de la contención de los recursos informáticos del sistema (incluidos CPU, RAM, E / S, etc.), los datos también son un recurso compartido por muchos usuarios. Cómo garantizar la coherencia y la eficacia del acceso simultáneo a los datos es un problema que todas las bases de datos deben resolver, y los conflictos de bloqueo también son un factor importante que afecta el rendimiento del acceso simultáneo a las bases de datos. Desde esta perspectiva, los bloqueos son particularmente importantes para las bases de datos y son más complicados.

2. Clasificación de bloqueo

  A partir de la granularidad de las operaciones de datos, se puede dividir en las siguientes categorías:

  • Bloqueo de mesa: durante el funcionamiento, toda la mesa se bloqueará
  • Bloqueo de fila: durante la operación, la fila de operación actual se bloqueará

Los tipos   de operaciones de datos se dividen en las siguientes categorías:

  • Bloqueo de lectura (bloqueo compartido) : para el mismo dato, se pueden realizar varias operaciones de lectura al mismo tiempo sin que se afecten entre sí.
  • ②. Bloqueo de escritura (bloqueo exclusivo) : Antes de que se complete la operación actual, bloqueará otros bloqueos de escritura y leer las cerraduras.

3. Bloqueo de MySQL

  En comparación con otras bases de datos, el mecanismo de bloqueo de MySQL es relativamente simple. Su característica más notable es que los diferentes motores de almacenamiento admiten diferentes mecanismos de bloqueo. La siguiente tabla muestra el estado de soporte de bloqueo de cada motor de almacenamiento:

  Las características de los tres tipos de bloqueos en MySQL Es se puede resumir a grandes rasgos de la siguiente manera: a

  partir de las características anteriores, es difícil decir en general qué cerradura es mejor, solo qué cerradura es más adecuada en términos de características de aplicación específicas. Solo desde la perspectiva de los bloqueos: los bloqueos a nivel de tabla son más adecuados para aplicaciones basadas en consultas, como las aplicaciones web, que actualizan los datos en función de las condiciones del índice; mientras que los bloqueos a nivel de fila son más adecuados para una gran cantidad de actualizaciones simultáneas de un una pequeña cantidad de datos diferentes según las condiciones del índice, y existen aplicaciones de consulta simultáneas, como algunos sistemas de procesamiento de transacciones en línea (OLTP).

4. Bloqueo de tabla MyISAM

  El motor de almacenamiento MyISAM solo admite bloqueos de tabla, que es el único tipo de bloqueo admitido en las primeras versiones de MySQL.

  • 1, la forma de aumentar tabla de bloqueo
      MyISAM la ejecución de la consulta ( SELECTantes), le dará automáticamente todas las tablas, además de un bloqueo de lectura que participan en la operación de actualización ( UPDATE, DELETE, INSERTetc. ) antes automáticamente a la tabla de escritura de bloqueo involucrados en este proceso y no incluidos Por lo tanto, los usuarios generalmente no necesitan usar LOCK TABLEcomandos directamente para bloquear la visualización de la tabla MyISAM. Los comandos específicos son los siguientes:
加表锁:lock table table_name read;
加写锁:lock table table_name write;

  Primero creamos una tb_booktabla nombrada e insertamos algunos datos, el código específico es el siguiente:

create datebase demo_03 default charset=utf8mb4;
use demo_03;
create table `tb_book`(
	`id` int(11) auto_increment,
	`name` varchar(50) default null,
	`publish_time` date default null,
	`status` char(1) default null,
	primary key(`id`)
)engine=myisam default charset=utf8;
insert into tb_book(id, name, publish_time, status)values(null, 'mysql从入门到精通','2020-01-01','1');
insert into tb_book(id, name, publish_time, status)values(null, 'java从入门到精通','2020-02-02','0');

create table `tb_user`(
	`id` int(11) auto_increment,
	`name` varchar(50) default null,
	primary key(`id`)
)engine=myisam default charset=utf8;
insert into tb_suer(id, name) values(null, 'stefan');
insert into tb_suer(id, name) values(null, 'napoleon');
  • 2. El caso de bloqueo de escritura
      obtiene el bloqueo de escritura de la tabla tb_book
lock table tb_book write;

  Realizar operaciones de consulta

select * from tb_book;

  El resultado de la ejecución es el siguiente: la

  operación de consulta se ejecuta con éxito.
  Realizar una operación de actualización

update tb_book set name = 'java编程思想(第二版)' where id = 1;

  El resultado de la ejecución es el siguiente: la

  operación de actualización se ejecuta con éxito.
  Por lo tanto, la compatibilidad mutua de los modos de bloqueo se muestra en la

  tabla: como se puede ver en la tabla anterior:

1). La operación de lectura de la tabla MyISAM no bloqueará las solicitudes de lectura de otros usuarios a la misma tabla, pero bloqueará la solicitud de escritura a la misma tabla;
2), la operación de escritura de la tabla MyISAM bloqueará a otros usuarios del misma tabla Operaciones de lectura y escritura;

  En resumen, el bloqueo de lectura bloqueará la escritura, pero no bloqueará la lectura. El bloqueo de escritura bloqueará tanto la lectura como la escritura. Además, la programación de bloqueo de lectura-escritura de MyISAM es de escritura primero, por lo que MyISAM no es adecuado como motor de almacenamiento para tablas primarias de escritura, porque después del bloqueo de escritura, otros subprocesos no pueden realizar ninguna operación y una gran cantidad de actualizaciones. dificultará la consulta Obtener el bloqueo, lo que provoca un bloqueo permanente.

  • 3. Verifique la contención de la cerradura.
show open tables;

  Los resultados de la ejecución son los siguientes:

  • In_user : el número de veces que la consulta utiliza actualmente la tabla. Si el número es cero, la mesa está abierta, pero no se está utilizando actualmente.
  • Name_locked : si el nombre de la tabla está bloqueado. El bloqueo de nombre se utiliza para cancelar o cambiar el nombre de la tabla y otras operaciones.
show status like 'Table%';

  Los resultados de la ejecución son los siguientes:

  Table_locks_immediate : se refiere al número de veces que los bloqueos a nivel de tabla se pueden obtener de inmediato. Cada vez que se obtiene el bloqueo de inmediato, el valor aumenta en 1
  Table_locks_waited : se refiere al número de veces que el bloqueo a nivel de tabla no se puede obtener de inmediato. Cada vez que espera, el valor aumenta en 1, este valor Alto indica que hay una contención de bloqueo de nivel de tabla más grave.

5. Bloqueo de fila InnoDB

  Las características de los bloqueos de fila: sesgo hacia el motor de almacenamiento InnoDB, alta sobrecarga, bloqueo lento; se producirán interbloqueos; la granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y la concurrencia es la más alta. Hay dos diferencias más importantes entre InnoDB y MyISAM: primero, admite transacciones; en cambio, usa bloqueos a nivel de fila .
  Una transacción es una unidad lógica de procesamiento compuesta por un conjunto de sentencias SQL. Una transacción tiene las siguientes cuatro características, denominadas atributos ACID de transacción para abreviar.

  Problemas causados ​​por el procesamiento de transacciones concurrentes

  • 1. Nivel de aislamiento de transacciones
      Para resolver las preguntas de mayor concurrencia de transacciones mencionadas anteriormente, la base de datos proporciona un cierto mecanismo de aislamiento de transacciones para resolver este problema. Cuanto más estricto sea el aislamiento de transacciones de la base de datos, menores serán los efectos secundarios de la concurrencia, pero mayor será el precio pagado, porque el aislamiento de transacciones esencialmente utiliza transacciones para ser "serializadas" hasta cierto punto, lo que obviamente está en contradicción con la "concurrencia".
      Hay cuatro niveles de aislamiento de base de datos, de bajo a alto, son Lectura no confirmada, Lectura confirmada, Lectura repetible y Serializable. Estos cuatro niveles pueden resolver los problemas de escritura sucia, lectura sucia, lectura no repetible y lectura fantasma uno por uno. uno.

      Debe tenerse en cuenta aquí: √ significa que puede aparecer, x significa que no aparecerá. El nivel de aislamiento predeterminado de la base de datos MySQL es Repeatable read, el método de vista es:
show variables like 'tx_isolation'; 

  El resultado de la ejecución es el siguiente:

  Debemos crear un bloqueo de tabla, de la siguiente manera:

create table test_innodb_lock(
	id int(11),
	name varchar(16),
	sex varchar(1)
)engine=innodb default charset=utf8;
insert into test_innodb_lock values(1, '100', '1');
insert into test_innodb_lock values(3, '3', '1');
insert into test_innodb_lock values(4, '400', '0');
insert into test_innodb_lock values(5, '500', '1');
insert into test_innodb_lock values(6, '600', '0');
insert into test_innodb_lock values(7, '700', '0');
insert into test_innodb_lock values(8, '800', '1');
insert into test_innodb_lock values(9, '900', '1');
insert into test_innodb_lock values(10, '200', '0');
create index idx_test_innodb_lock_id on test_innodb_lock(id);
create index idx_test_innodb_lock_name on test_innodb_lock(name);
  • 2. La demostración básica del bloqueo de filas
      primero desactiva la función de envío automático
set autocommit = 0;

  Los resultados de la ejecución son los siguientes:

  todos los datos se pueden consultar normalmente

select * from test_innodb_lock;

  El resultado de la ejecución es el siguiente:

  consulta los datos con id 3;

select * from test_innodb_lock where id = 3;

  El resultado de la ejecución es el siguiente:

  actualice los datos con id 3;

update test_innodb_lock set name = 'A1' where id = 3;

  Los resultados de la ejecución son los siguientes:

  Envíe la transacción mediante confirmación, desbloqueo y actualización normalmente.

commit;

  Los resultados de la ejecución son los siguientes: No es

  difícil ver que las operaciones son todos los datos de la misma fila, a continuación se demostrarán los datos de diferentes filas;

update test_innodb_lock set name = 'B1' where id = 3;
update test_innodb_lock set name = 'C1' where id = 5;

  Los resultados de la ejecución son los siguientes:

  • 3. Si no se actualiza ningún bloqueo de fila de índice a bloqueo de tabla,
      si los datos no se recuperan mediante condiciones de índice, InnoDB bloqueará todos los registros de la tabla y el efecto real es el mismo que el bloqueo de tabla. Ver el índice de la tabla actual
show index from test_innodb_lock;

  Los resultados de la ejecución son los siguientes:

  primero desactive la confirmación automática de la transacción

set autocommit = 0;

  Los resultados de la ejecución son los siguientes:

  A continuación, ejecute la instrucción de actualización

update test_innodb_lock set sex = '2' where name = 400;
update test_innodb_lock set sex = '2' where id = 9;

  A continuación, ejecute la declaración de actualización y

  finalmente confirme la transacción.

commit;

  A continuación, ejecute la declaración de actualización

  • 4. Peligros de bloqueo de brecha.
      Cuando usamos condiciones de rango en lugar de condiciones iguales para recuperar datos y solicitar bloqueos compartidos o exclusivos, InnoDB bloqueará los datos existentes que cumplan con las condiciones; para los valores clave en el rango de condición, pero no para los existentes. El registro se llama "gap (GAP)", e InnoDB también bloqueará este "gap". Este mecanismo de bloqueo es el llamado "gap lock" (bloqueo de tecla siguiente). detalles como sigue:
  • 5. Contención de bloqueo de fila InnoDB
show status like 'innodb_row_lock%';

  Los resultados de la ejecución son los siguientes:

  • Innodb_row_lock_current_waits : el número de bloqueos en espera actualmente
  • Innodb_row_lock_time : el tiempo total que el sistema está bloqueado desde el inicio del sistema
  • Innodb_row_lock_time_avg : el tiempo promedio empleado en cada espera
  • Innodb_row_lock_time_max : el tiempo que lleva esperar el mayor tiempo desde que se inició el sistema
  • Innodb_row_lock_waits : el número total de esperas desde que se inició el sistema hasta ahora

  Cuando el número de esperas es alto y la duración de cada espera no es pequeña, debemos analizar por qué hay tantas esperas en el sistema y luego proceder a formular un plan de optimización basado en los resultados del análisis.
  En resumen, debido a que el motor de almacenamiento InnoDB implementa el bloqueo a nivel de fila, aunque la pérdida de rendimiento en la implementación del mecanismo de bloqueo puede ser mayor que la de los bloqueos de tabla, es muy superior a los bloqueos de tabla MyISAM en términos de capacidades generales de procesamiento concurrente. de. Cuando la concurrencia del sistema es alta, el rendimiento general de InnoDB tendrá ventajas obvias en comparación con MyISAM. Sin embargo, el bloqueo de nivel de fila de InnoDB también tiene su lado frágil.Cuando lo usamos incorrectamente, el rendimiento general de InnoDB puede no solo ser más alto que el de MyISAM, sino que incluso puede ser peor. A continuación, se encuentran las sugerencias de optimización:

  • En la medida de lo posible, toda la recuperación de datos se puede completar a través del índice, para evitar la actualización de bloqueos de fila no indexados a bloqueos de tabla.
  • Diseñe el índice de manera razonable para minimizar el alcance de la cerradura
  • Minimice las condiciones de índice y los rangos de índice tanto como sea posible para evitar bloqueos de brechas
  • Intente controlar el tamaño de la transacción, reduzca la cantidad de recursos bloqueados y el tiempo
  • Utilice el aislamiento de transacciones de bajo nivel tanto como sea posible (pero debe cumplir con los requisitos a nivel empresarial).

Dos habilidades SQL de uso común

1. Orden de ejecución de SQL

  El proceso de redacción de una declaración es el siguiente:

select distinct <select list>
from <left_table> <join_type>
join <right_table> on <join_condition>
where <where_condition>
group by <grop_by_list>
having <having_condition>
order by <order_by_condition>
limit <limit_params>;

  El proceso de ejecución es el siguiente:

from <left_table>
on <join_condition>
<join_type> join <right_table>
where <where_condition>
group by <grop_by_list>
having <having_condition>
select distinct <select list>
order by <order_by_condition>
limit <limit_params>;

2. Varias funciones en MySQL

  La expresión regular se refiere a una sola cadena que se utiliza para describir o hacer coincidir una serie de cadenas que se ajustan a una determinada regla de sintaxis.

  Los comandos específicos son los siguientes:

select * from emp where name regexp '^T';
select * from emp where name regexp '2$';
select * from emp where name regexp '[uvw]';

  A continuación se muestra una serie de funciones como la suma matemática en MySQL, específicamente de la siguiente manera:

  función de cadena, específicamente de la siguiente manera:

  función de fecha, específicamente de la siguiente manera:

  finalmente, función agregada de MySQL, específicamente de la siguiente manera:

para resumir

  En el artículo anterior, presentamos la optimización de aplicaciones , la optimización de la caché de consultas en mysql, la optimización de la gestión de memoria en mysql y el ajuste de parámetros de concurrencia en mysql. Este artículo le presenta los bloqueos en MySQL, incluida la contención de bloqueos y el contenido relacionado de bloqueos de fila y bloqueos de tabla. Además, le presento algunas técnicas de uso común en SQL, incluido el orden en el que se ejecutan las sentencias de SQL y las funciones principales en sql. Por lo tanto, mysql es una habilidad muy importante. Casi todos los trabajos en la computadora necesitan una habilidad de mysq. Por lo tanto, necesitamos un dominio especial. La vida es interminable y la lucha es interminable Trabajamos duro todos los días, estudiamos mucho, mejoramos constantemente nuestras habilidades y creemos que aprenderemos algo. ¡Vamos! ! !

Supongo que te gusta

Origin blog.csdn.net/Oliverfly1/article/details/111715323
Recomendado
Clasificación