Especificación de MySQL y optimización del rendimiento

1. Después de escribir SQL, primero explique para ver el plan de ejecución (optimización del rendimiento de SQL)

Cuando desarrolle y escriba SQL a diario, intente desarrollar este buen hábito: después de escribir SQL, utilice explicar para analizarlo y preste especial atención a si se debe utilizar el índice.

2. Opere la declaración de eliminación o actualización y agregue un límite (medicina de arrepentimiento SQL)

  • "Reducir el costo de SQL escrito incorrectamente" . Cuando ejecuta este SQL en la línea de comando, si no agrega límite, obtendrá un "apretón de mano accidental" durante la ejecución, y todos los datos pueden ser eliminados. ¿Qué sucede si "elimina incorrectamente" ? Con el límite 200 agregado, es diferente. La eliminación del error es solo la pérdida de 200 datos, que se pueden recuperar rápidamente a través del registro binlog.

  • "Es probable que la eficiencia de SQL sea mayor" , agrega el límite 1 a la línea SQL, si el primero alcanza el retorno de destino, si no hay límite, la tabla de escaneo continuará ejecutándose.

  • "Evite transacciones largas" . Cuando se ejecuta la eliminación, si age agrega un índice, MySQL agregará bloqueos de escritura y bloqueos de espacios a todas las filas relacionadas, y todas las filas relacionadas con la ejecución se bloquearán. Si la cantidad de eliminaciones es grande, afectará directamente a las empresas relacionadas. No disponible.

  • "Si la cantidad de datos es grande, es fácil  llenar la CPU". Si elimina una gran cantidad de datos, no limite la cantidad de registros, es fácil llenar la CPU, lo que resulta en una eliminación más lenta.

3. Al diseñar la tabla, agregue los comentarios correspondientes a todas las tablas y campos (la especificación SQL es elegante)

Este buen hábito se debe desarrollar, al diseñar las tablas de la base de datos, todas las tablas y campos se agregan con los comentarios correspondientes, lo que es más fácil de mantener posteriormente.

"Contramedida:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `balance` int(11) DEFAULT NULL,
  `create_time` datetime NOT NULL ,
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;

"Ejemplo:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

4. Formato de escritura SQL, mantenga el tamaño de la palabra clave consistente y use sangría. (La especificación SQL es elegante)

"Contramedida:"

SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo = '1班' group by stu.name.

"Ejemplo:"

SELECT stu.name, sum(stu.score)
FROM Student stu
WHERE stu.classNo = '1班'
GROUP BY stu.name

5. La instrucción INSERT indica el nombre del campo correspondiente (especificación SQL elegante)

"Contramedida:"

insert into Student values ('666','捡田螺的小男孩','100');

"Ejemplo:"

insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');

 6. Cambie la operación SQL y ejecútela primero en el entorno de prueba, especifique los pasos detallados de la operación y el plan de reversión, y revíselo antes de entrar en producción. (Medicina de arrepentimiento SQL)

  • La operación SQL modificada se prueba primero en el entorno de prueba para evitar errores de sintaxis y ponerla en producción.

  • Para cambiar la operación Sql, debe especificar los pasos detallados de la operación, especialmente cuando hay dependencias, como: modificar primero la estructura de la tabla y luego agregar los datos correspondientes.

  • Existe un plan de reversión para cambiar las operaciones de SQL y, antes de la producción, revise el cambio de SQL correspondiente.

7. Al diseñar la tabla de la base de datos, agregue tres campos: clave principal, create_time, update_time. (La especificación SQL es elegante)

"Contramedida:"

CREATE TABLE `account` (
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

"Ejemplo:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

"Razón:"

  • La clave principal generalmente se agrega, la tabla sin clave principal no tiene alma

  • Se recomienda agregar la hora de creación y la hora de actualización. Los registros detallados de auditoría y seguimiento son todos útiles.

El manual de desarrollo de Ali también menciona este punto, como se muestra en la figura

8. Después de escribir la declaración SQL, verifique las columnas detrás de dónde, ordene por, agrupe por y si las columnas asociadas con varias tablas se han indexado y se prefiere el índice combinado. (Optimización del rendimiento de SQL)

 "Contramedida:"

select * from user 
where address ='深圳' order by age;

"Ejemplo:"

添加索引
alter table user add index idx_address_age (address,age)

 

9. Antes de modificar o eliminar datos importantes, haga una copia de seguridad, una copia de seguridad primero, una copia de seguridad primero (medicina de arrepentimiento SQL)

Si desea modificar o eliminar datos, debe hacer una copia de seguridad de los datos que se modificarán antes de ejecutar SQL. En caso de mal funcionamiento, aún puede probar un poco de "medicina del arrepentimiento" ~

10. El campo detrás de dónde, preste atención a la conversión implícita de su tipo de datos (optimización del rendimiento de SQL)

"Contramedida:"

//userid 是varchar字符串类型
select * from user where userid =123;

"Ejemplo:" 

select * from user where userid ='123';

"Razón:"

Porque cuando no se agregan las comillas simples, es la comparación entre cadenas y números, y sus tipos no coinciden. MySQL hará una conversión de tipo implícita, los convertirá a números de punto flotante y luego los comparará, y finalmente hará que el índice falle.

11. Intente definir todas las columnas como NOT NULL (la especificación SQL es elegante)

  • La columna "NOT NULL ahorra más espacio". La columna NULL necesita un byte adicional como indicador para determinar si es NULL.

  • "Las columnas NULL deben prestar atención al problema de los punteros nulos" . Al calcular y comparar columnas NULL, debe prestar atención al problema de los punteros nulos.

12. Para modificar o eliminar SQL, primero escriba DÓNDE para verificar, y luego agregue eliminar o actualizar después de la confirmación (medicina de arrepentimiento SQL)

Especialmente al operar los datos producidos, si encuentra SQL modificado o eliminado, primero agregue una consulta where, confirme OK y luego realice la operación de actualización o eliminación

13. Reduzca el retorno de campo innecesario, como usar select <campo específico> en lugar de seleccionar * (optimización del rendimiento de SQL)

"Contramedida:"

select * from employee;

"Ejemplo:"

select id,name from employee;

Razón:

  • Ahorre recursos y reduzca la sobrecarga de la red.

  • Los índices de cobertura se pueden utilizar para reducir las tablas anteriores y mejorar la eficiencia de las consultas.

14. Todas las tablas deben utilizar el motor de almacenamiento Innodb (especificación SQL elegante)

Innodb  "admite transacciones, admite bloqueos de nivel de fila y mejor capacidad de recuperación". Tiene un mejor rendimiento en condiciones de alta concurrencia, por lo que no hay requisitos especiales (es decir, funciones que Innodb no puede cumplir, como almacenamiento de columnas, datos de espacio de almacenamiento, etc.) , Todas las tablas deben utilizar el motor de almacenamiento Innodb

15. Intente usar UTF8 de manera uniforme para los conjuntos de caracteres de bases de datos y tablas (la especificación SQL es elegante)

Intente utilizar la codificación UTF8 de manera uniforme

  • Puede evitar el problema confuso

  • Puede evitar el problema de invalidación del índice causado por la comparación y conversión de diferentes juegos de caracteres

"Si necesita almacenar emoticonos, elija utf8mb4 para almacenar, preste atención a la diferencia entre este y la codificación utf-8".

begin;
update account set balance =1000000
where name ='捡田螺的小男孩';
commit;

16. Intente utilizar varchar en lugar de char. (Optimización del rendimiento de SQL)

"Contramedida:"

 `deptName` char(100) DEFAULT NULL COMMENT '部门名称'

"Ejemplo:"

`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'

Razón:

  • Dado que el espacio de almacenamiento de los campos de longitud variable es pequeño, se puede ahorrar espacio de almacenamiento.

17. Si modifica el significado de un campo o lo agrega al estado del campo, debe actualizar el comentario del campo a tiempo. (La especificación SQL es elegante)

Este punto es el protocolo Mysql en el manual de desarrollo de Ali. Su campo, especialmente al representar el estado de enumeración, si se modifica el significado o cuando se agrega el estado, para un mejor mantenimiento posterior, debe actualizar los comentarios del campo de inmediato.

18. Línea de comando SQL para modificar datos, desarrollar el hábito de comenzar + confirmar la transacción (medicina de arrepentimiento SQL)

"Contramedida:"

update account set balance =1000000
where name ='捡田螺的小男孩';

"Ejemplo:"

begin;
update account set balance =1000000
where name ='捡田螺的小男孩';
commit;

19. La denominación del índice debe estar estandarizada, el índice de clave principal se llama pk_ nombre de campo, el índice único se llama uk _ nombre de campo, el nombre de índice ordinario es idx _ nombre de campo. (La especificación SQL es elegante)

Descripción: pk_ es la clave principal; uk_ es la clave única; idx_ es la abreviatura de index.

20. La conversión de funciones y el cálculo de expresiones no se realizan en las columnas de la cláusula WHERE.

Suponiendo que loginTime está indexado

"Contramedida:"

select userId,loginTime 
from loginuser
where Date_ADD(loginTime,Interval 7 DAY) >=now();

"Ejemplo:"

explain  select userId,loginTime 
from loginuser 
where  loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY);

"Razón:"

Use la función incorporada de MySQL en la columna de índice, el índice no es válido

21. Si hay demasiados cambios / actualizaciones, considere el procesamiento por lotes.

"Contramedida:"

delete from account  limit 100000;

"Ejemplo:"

for each(200次)
{
 delete from account  limit 500;
}

"Razón:"

  • Las operaciones por lotes grandes provocarán retrasos maestro-esclavo.

  • Las operaciones a gran escala generarán grandes transacciones y bloqueos.

  • Las operaciones a gran escala y demasiados datos llenarán la CPU.

 

Previous: Optimización del rendimiento del acceso a la base de datos de Oracle

Siguiente: Copia de seguridad y recuperación de la base de datos PostgreSQL

 

Reimpreso: https://blog.csdn.net/weiwenhou/article/details/109505984

 

Supongo que te gusta

Origin blog.csdn.net/guorui_java/article/details/111302048
Recomendado
Clasificación