Varias formas de optimizar la base de datos MySQL (debe preguntar en una entrevista por escrito)

Plataforma de autor:

| CSDN: blog.csdn.net/qq_4115394…

| Pepitas: juejin.cn/user/651387…

| Zhihu: www.zhihu.com/people/1024…

| GitHub: github.com/JiangXia-10…

| Cuenta oficial: nota 1024

Este artículo tiene un total de 3929 palabras, y el tiempo estimado de lectura es de 10 minutos

prefacio

Recientemente cambié de trabajo. Me entrevistaron hace algún tiempo y me hicieron algunas preguntas con frecuencia. Aquí hay algunas clasificaciones y resúmenes, con la esperanza de ayudar a los estudiantes que también planean encontrar un trabajo.

Entre ellos, las preguntas sobre la base de datos se hacen con frecuencia, y básicamente todas las empresas preguntan sobre la frecuencia de la base de datos, especialmente el conocimiento sobre la optimización de la base de datos. Así que aquí hay un resumen del contenido sobre la optimización de bases de datos, algunos de los cuales son mi experiencia habitual de desarrollo y otros son mi propio contenido de aprendizaje. Entonces, si hay algo mal, ¡por favor discuta y corríjame!

texto

De hecho, la optimización de la base de datos no solo es una gran cantidad de preguntas en la entrevista escrita, sino también porque en el trabajo real, la optimización de la base de datos puede afectar el rendimiento del sistema, y ​​de hecho es muy importante, por lo que a menudo es necesario escribir un script sql razonable y optimizar la base de datos. La optimización de la base de datos se puede considerar principalmente desde los siguientes aspectos:

1. Seleccione los atributos de campo más aplicables

MySQL puede admitir el acceso a grandes cantidades de datos, pero en términos generales, cuanto más pequeña es la tabla en la base de datos, más rápido se ejecuta la consulta en ella. Por tanto, a la hora de crear una tabla, para obtener un mejor rendimiento, podemos establecer el tamaño de los campos de la tabla lo más razonable posible, y no es necesario seleccionar el mayor.

Por ejemplo, si el campo de nombre de usuario se define en la tabla de usuario y se establece en varchar (255), obviamente agregará espacio innecesario a la base de datos, porque sabemos que el nombre no puede alcanzar una longitud tan larga de todos modos. mismo.

Otra forma de mejorar la eficiencia es establecer el campo en NOT NULL siempre que sea posible, de modo que la base de datos no necesite comparar valores NULL al ejecutar consultas en el futuro.

Para algunos campos de texto, como "género", podemos definirlos como tipo ENUM. Porque en MySQL, el tipo ENUM se trata como datos numéricos y los datos numéricos se procesan mucho más rápido que el tipo de texto. De esta manera, podemos mejorar el rendimiento de la base de datos.

2. Mesa de diseño razonable

Para el diseño de tablas mysql, lo mejor es seguir los siguientes principios:

a. La cantidad de datos en una sola tabla

Todas las tablas deben agregar comentarios, y se recomienda controlar el volumen de datos de una sola tabla dentro de los 30 millones;

Trate de no guardar datos de campo grandes, como no almacenar datos grandes como imágenes y archivos en la base de datos;

B. Especificación de uso de la tabla

Los campos grandes y los campos con baja frecuencia de acceso deben dividirse para separar los datos calientes y fríos;

Al crear una tabla de datos, intente controlar la cantidad de campos en una sola tabla dentro de 20 campos;

c. Especificación del índice

La creación de índices puede mejorar en gran medida la eficiencia del acceso a los datos, pero los índices deben crearse de manera razonable, como:

1. El número de índices en una sola tabla no excede de 5, y el número de campos en un solo índice no excede de 5;

2. Se recomienda utilizar columnas autoincrementales para la clave principal de INNODB. La clave principal no debe modificarse y la cadena no debe usarse como clave principal. Si no se especifica la clave principal, INNODB utilizará una clave única. y un índice no nulo en su lugar;

3. Si se trata de un índice compuesto, el campo con mayor distinción se coloca delante del índice;

4. Evitar índices redundantes o duplicados: crear índices conjuntos razonablemente (evitar la redundancia);

5. No cree índices en columnas de baja cardinalidad, como campos como 'sexo';

6. No realice operaciones matemáticas y operaciones de función en columnas de índice

Algunos métodos de uso de índice incorrectos conducirán a la falla del índice. Puede consultar el artículo anterior: Varias habilidades de optimización de SQL que deben dominarse (7): El mejor uso de los índices

3. Use uniones (JOIN) en lugar de subconsultas (Sub-Queries)

A menudo necesitamos usar algunas subconsultas para usar los resultados de la consulta como condiciones en otra consulta. MySQL admite subconsultas SQL desde 4.1. Por ejemplo, si necesitamos averiguar la información básica de los estudiantes que reprobaron el examen, primero debemos consultar la identificación de los estudiantes que reprobaron el examen de la tabla de puntuación y luego consultar los datos de información básica de la información básica. mesa de los estudiantes:

select cname,age,gender from student where id in (select stu_id from score where score<60)

Aunque el uso de subconsultas puede completar muchas operaciones de SQL que lógicamente requieren varios pasos para completarse a la vez, también puede evitar bloqueos de transacciones o tablas, y es fácil de escribir. Sin embargo, la declaración escrita de esta manera es muy detallada y la eficiencia de la consulta es relativamente lenta, por lo que, en algunos casos, la subconsulta se puede reemplazar por una unión más eficiente. Por ejemplo, la declaración de consulta anterior se puede escribir así

select cname,age,gender from student s left join score c on s.id=c.stu_id where c.score<60

La razón por la que usar join es más eficiente es que MySQL no necesita crear una tabla temporal en la memoria para completar esta consulta lógica que requiere dos pasos.

4. asuntos

Sabemos que en muchos casos, algunas operaciones en la base de datos no se pueden completar con solo una o unas pocas declaraciones SQL. Más a menudo es necesario usar una serie de declaraciones para completar algún tipo de trabajo. Pero en este caso, cuando una determinada instrucción en el bloque de instrucciones se ejecuta incorrectamente, la operación de todo el bloque de instrucciones se vuelve incierta. Un ejemplo muy clásico, una transferencia bancaria necesita ser debitada de una cuenta y depositada en una cuenta, si una cuenta a ha sido debitada exitosamente, ocurre una situación inesperada en este momento, o la ejecución de la siguiente declaración es incorrecta, y el la cuenta b no se deposita En este momento, la consistencia de los datos se destruye y no se ajusta a la atomicidad. Entonces necesita usar transacciones en este momento. Para transacciones, consulte el artículo anterior: nivel de aislamiento de transacciones .

Las cosas comienzan con la palabra clave BEGIN y terminan con la palabra clave COMMIT. Si una operación de SQL falla en el medio, entonces el comando ROLLBACK puede restaurar la base de datos al estado anterior al inicio de BEGIN. Por ejemplo

BEGIN;
  INSERT INTO student SET cname='江夏';
  UPDATE score set score=99 where id=20
COMMIT;

Otra función importante de las transacciones es que cuando varios usuarios usan la misma fuente de datos al mismo tiempo, puede proporcionar a los usuarios un método de acceso seguro al bloquear la base de datos, lo que puede garantizar que las operaciones del usuario no se vean interferidas por otros usuarios.

5. Usa claves foráneas

A veces, se pueden usar claves externas para garantizar la asociación de datos.

Por ejemplo, el uso de una clave externa en la tabla de puntajes puede garantizar que cada registro de puntaje apunte a un estudiante correspondiente. Aquí, la clave externa puede asignar el sty_id en la tabla de puntajes al id en la tabla de estudiantes, de modo que cualquier registro sin un stu_id válido no se actualizará ni se insertará en el puntaje.

La sintaxis de la clave foránea es la siguiente:

具体的语法格式如下:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

Para dos tablas con una relación de asociación, la tabla donde se encuentra la clave principal en el campo asociado es la tabla principal (tabla principal) y la tabla donde se encuentra la clave externa es la tabla secundaria (tabla secundaria).

Al definir claves foráneas, se deben seguir las siguientes reglas:

1. La tabla principal ya debe existir en la base de datos o ser una tabla que se esté creando actualmente. En el último caso, la tabla maestra y la tabla esclava son la misma tabla, dicha tabla se denomina tabla autorreferencial y esta estructura se denomina integridad autorreferencial. Se debe definir una clave principal para la tabla principal.

2. La clave principal no puede contener valores nulos, pero se permiten valores nulos en claves foráneas. Es decir, el contenido de la clave externa es correcto siempre que todos los valores no nulos de la clave externa aparezcan en la clave principal especificada.

3. Especifique el nombre de la columna o una combinación de nombres de columna después del nombre de la tabla principal. Esta columna o combinación de columnas debe ser la clave principal o la clave candidata de la tabla principal.

4. El número de columnas de la clave externa debe ser el mismo que el número de columnas de la clave primaria de la tabla principal.

5. El tipo de datos de la columna en la clave externa debe ser el mismo que el tipo de datos de la columna correspondiente en la clave principal de la tabla principal.

6. Usa índices

La indexación es una forma común de mejorar el rendimiento de la base de datos. Permite que el servidor de la base de datos recupere filas específicas mucho más rápido que sin un índice, especialmente cuando la instrucción de consulta contiene comandos como MAX(), MIN() y ORDERBY. La mejora del rendimiento es aún más pronunciado.

¿Qué campos deben indexarse?

En términos generales, los índices deben construirse en aquellos campos que se utilizarán para la clasificación JOIN, WHERE y ORDERBY. Intente no indexar un campo en la base de datos que contenga una gran cantidad de valores duplicados. Para un campo de tipo ENUM, es muy probable que haya una gran cantidad de valores duplicados

Por ejemplo, indexar el campo "género" en la tabla de usuarios no ayudará y puede reducir el rendimiento de la base de datos. Al crear una tabla, puede crear un índice apropiado al mismo tiempo, o puede usar ALTER TABLE o CREATE INDEX para crear un índice más adelante. Además, MySQL admite la indexación y la búsqueda de texto completo a partir de la versión 3.23.23. Un índice de texto completo es un índice de tipo FULLTEXT en MySQL, pero solo se puede usar para tablas de tipo MyISAM. Para una base de datos grande, es muy rápido cargar datos en una tabla sin un índice FULLTEXT y luego usar ALTER TABLE o CREATE INDEX para crear el índice. Pero si los datos se cargan en una tabla que ya tiene un índice FULLTEXT, el proceso de ejecución será muy lento.

Para algunos usos de los índices, puede consultar el artículo anterior: Varias habilidades de optimización de SQL que se deben dominar (7): El mejor uso de los índices ; ¿todavía no sabe qué es un índice de base de datos ?

7. Mesa de bloqueo

Dado que la base de datos se bloqueará durante la ejecución de la transacción, las solicitudes de otros usuarios solo pueden esperar temporalmente hasta que finalice la transacción. En algunos casos, podemos lograr un mejor rendimiento ampliando la tabla bloqueada.

Un candado es una bandera asociada a una tabla. MySQL permite que las sesiones de los clientes adquieran explícitamente bloqueos de tablas para evitar que otras sesiones accedan a la misma tabla durante un período de tiempo específico. Una sesión de cliente solo puede adquirir o liberar bloqueos de tabla para sí misma. No puede adquirir ni liberar bloqueos de tablas de otras sesiones.

La siguiente declaración adquiere explícitamente un bloqueo de tabla:

LOCK TABLES table_name [READ | WRITE]

Para bloquear una tabla, especifique su nombre después de la palabra clave LOCK TABLES. Además, también puede especificar el tipo de bloqueo, que puede ser LECTURA o ESCRITURA.

Para liberar un bloqueo en una tabla, use la siguiente declaración:

UNLOCK TABLES;

Resumir

Los anteriores son algunos puntos sobre mysql en la optimización de la base de datos. La optimización de la base de datos no solo es un punto de conocimiento que se pregunta con frecuencia en las entrevistas escritas, sino que también se usa a menudo en el desarrollo y la aplicación reales. Si hay algo mal, ¡coméntelo y corríjame! Y si hay otros métodos o lugares mejores que no se mencionan en este artículo, ¡bienvenidos a intercambiar y discutir!

sugerencia relacionada

Supongo que te gusta

Origin blog.csdn.net/qq_41153943/article/details/125570444
Recomendado
Clasificación