Resumen de los métodos de optimización de datos de MySQL

Registro de notas de estudio de base de datos

1. Seleccione los atributos de campo más aplicables.

1. El ancho del campo debe ser lo más pequeño posible.

MySQL puede admitir el acceso a grandes cantidades de datos, pero en general, cuanto más pequeña es la tabla en la base de datos, más rápido se ejecuta la consulta. Por lo tanto, al crear una tabla, para obtener un mejor rendimiento, podemos establecer el ancho de los campos en la tabla lo más pequeño posible.
Por ejemplo, al definir el campo del código postal, si se establece en CHAR (255), obviamente agrega espacio innecesario a la base de datos, e incluso el uso de VARCHAR es redundante, porque CHAR (6) puede ser muy bueno Completó la tarea . De manera similar, si es posible, deberíamos usar MEDIUMINT en lugar de BIGIN para definir campos enteros.

2. Intente establecer el campo como no NULL

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

3. Establezca los datos de clasificación en tipo ENUM.

Para algunos campos de texto, como "provincia" o "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 forma, podemos mejorar el rendimiento de la base de datos.

Dos, use join (JOIN) en lugar de subconsultas (Subconsultas)

El uso de subconsultas puede completar muchas operaciones SQL que lógicamente requieren varios pasos para completarse a la vez. Al mismo tiempo, también puede evitar el bloqueo de transacciones o tablas, y es fácil de escribir. Sin embargo, en algunos casos, las subconsultas se pueden reemplazar por combinaciones más eficientes (JOIN) ... Por ejemplo, supongamos que queremos buscar a todos los usuarios que no tienen registros de pedidos, podemos usar la siguiente consulta para completar:

SELECT*FROM customer_info
WHERE customer_id  NOT IN (SELECT customer_id FROM sales_info)

Si usa JOIN ... para completar esta consulta, la velocidad será mucho más rápida. Especialmente cuando hay un índice de CustomerID en la tabla sales_info, el rendimiento será mejor. La consulta es la siguiente:

SELECT*FROM customer_info
LEFT JOIN sales_info ON customer_info.customer_id=sales_info.customer_id
WHERE sales_info.customer_id IS NULL

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

Tres, use union (UNION) en lugar de una tabla temporal creada manualmente

El operador UNION se utiliza para combinar los conjuntos de resultados de dos o más sentencias SELECT.
Tenga en cuenta que cada instrucción SELECT dentro de UNION debe tener el mismo número de columnas. Las columnas también deben tener tipos de datos similares. Al mismo tiempo, el orden de las columnas en cada instrucción SELECT debe ser el mismo.

MySQL ha admitido consultas UNION desde la versión 4.0. Puede combinar dos o más consultas SELECT que requieren tablas temporales en una sola consulta. Al final de la sesión de consulta del cliente, la tabla temporal se eliminará automáticamente para garantizar que la base de datos esté ordenada y sea eficiente. Cuando usamos UNION para crear una consulta, solo necesitamos usar UNION como palabra clave para conectar múltiples declaraciones de selección.

En cuarto lugar, utilice transacciones (Transacción) para garantizar la coherencia de los datos y mejorar la velocidad.

Aunque podemos usar subconsultas (Subconsultas), uniones (JOIN) y uniones (UNION) para crear una variedad de consultas, no todas las operaciones de la base de datos se pueden completar con solo una o unas pocas declaraciones SQL de. Más a menudo, es necesario utilizar 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, el funcionamiento de todo el bloque de instrucciones se vuelve incierto. Imagine que si desea insertar ciertos datos en dos tablas relacionadas al mismo tiempo, puede haber una situación de este tipo: después de que la primera tabla se haya actualizado con éxito, la base de datos aparece repentinamente inesperada, lo que hace que la operación en la segunda tabla no sea correcta. completado, de esta manera, causará datos incompletos, e incluso destruirá los datos en la base de datos.
Para evitar esta situación, debe utilizar la transacción, su función es:

  1. O todas las sentencias del bloque de sentencias se realizaron correctamente o todas fallaron. En otras palabras, se puede mantener la consistencia e integridad de los datos en la base de datos. Las cosas comienzan con la palabra clave BEGIN y terminan con la palabra clave COMMIT. Mientras tanto, una operación SQL falla, luego el comando ROLLBACK puede restaurar la base de datos al estado anterior a BEGIN.
  2. Otra función importante de la transacción es que cuando varios usuarios utilizan la misma fuente de datos al mismo tiempo, puede utilizar el método de bloqueo de la base de datos para proporcionar a los usuarios un método de acceso seguro, que puede garantizar que la operación del usuario no sea interferida por otros. usuarios.
  3. Escrito en forma de transacciones, no es necesario conectarse a la base de datos varias veces, lo que puede mejorar el rendimiento y aumentar la velocidad de agregar, eliminar, verificar y modificar.
BEGIN; //或start transaction
INSERT INTO salesinfo SET CustomerID=14;//语句1
UPDATE inventory SET Quantity=11 WHERE item='book';//语句2
COMMIT;
//若失败如 
//if(update失败) {rollback} 

Un ejemplo común es la transferencia bancaria. La cuenta A transfiere cien millones (T1) a la cuenta B. En el proceso de este tipo de transacción, hay varias preguntas en las que vale la pena pensar:
cómo garantizar simultáneamente que las transacciones anteriores

¿El monto total de la cuenta A disminuye en 100 millones y el monto total de la cuenta B aumenta en 100 millones? A
A y C al mismo tiempo la cuenta si la transacción de la cuenta (T2), ¿cómo hacer dos transacciones independientemente una de la otra? I
Si la transacción se completa colapso repentino de la base de datos, ¿cómo garantizar el éxito de los datos de la transacción almacenados en la base de datos?
¿Cómo puede D garantizar la legitimidad de los datos (no se crea ni desaparece dinero de la nada) mientras se respalda una gran cantidad de transacciones? C.
Para asegurar que la transacción se lleve a cabo con normalidad y confiabilidad, la base de datos debe resolver los cuatro problemas anteriores. Este es el trasfondo del nacimiento de la transacción. Puede resolver los cuatro problemas anteriores. En consecuencia, tiene cuatro características principales: es decir ACIDO

  • Atomicidad: la transacción se completa o se cancela. Si la transacción falla, el estado vuelve a antes de la transacción (la transacción se revierte). Son inseparables.
  • Aislamiento: si dos transacciones T1 y T2 se ejecutan al mismo tiempo, los resultados finales de las transacciones T1 y T2 son los mismos, independientemente de
    quién termine primero T1 y T2. El aislamiento se puede solucionar bloqueando.
  • Durabilidad: una vez que se confirma la transacción, pase lo que pase (como un fallo o error de la base de datos), los datos aún se pueden almacenar en la base de datos. Cuando la base de datos se reinicia después de un bloqueo debido a razones irresistibles, se asegurará de que los datos se guarden en el disco para transacciones confirmadas con éxito, y los datos correspondientes se revertirán para transacciones no confirmadas.
  • Coherencia: solo los datos legales (de acuerdo con las restricciones relacionales y funcionales) se pueden escribir en la base de datos. Para asegurarse de que el dinero no surja o desaparezca de la nada en el sistema, confíe en la atomicidad y el aislamiento.

La base de datos logra este objetivo a través del registro de transacciones.

  • Si escribe en el disco cada vez que actualiza, debido a que los datos son aleatorios, provocará una gran cantidad de E / S aleatorios y el rendimiento será muy deficiente.
  • Si no escribe en el disco inmediatamente después de cada actualización, una vez que la base de datos falla, los datos se perderán

El compromiso es:

  • Los cambios de datos se agregan al búfer de registro en orden cronológico en forma de registro de transacciones y se escriben en el registro de transacciones mediante un algoritmo específico. Se trata de una E / S secuencial, con mejor rendimiento
    . El administrador de datos analiza el registro de transacciones y escrito por un algoritmo específico. plate

También existe el concepto de nivel de aislamiento para transacciones. Se pueden agregar diferentes niveles de bloqueos de aislamiento a diferentes negocios para mejorar el rendimiento.

Cinco, cierra la mesa

Aunque la transacción es una muy buena manera de mantener la integridad de la base de datos, pero debido a su exclusividad, a veces afecta el rendimiento de la base de datos, especialmente en un gran sistema de aplicaciones. 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 el final de la transacción. Si un sistema de base de datos es utilizado por solo unos pocos usuarios, el impacto de las transacciones no se convertirá en un gran problema; pero si hay miles de usuarios accediendo a un sistema de base de datos al mismo tiempo, por ejemplo, accediendo a un sitio web de comercio electrónico, producirá un retraso de respuesta más grave.

De hecho, en algunos casos podemos obtener un mejor rendimiento bloqueando la mesa. El siguiente ejemplo usa el método de bloquear la tabla para completar la función de transacción en el ejemplo anterior.

LOCK TABLE inventory WRITE SELECT Quantity FRO Minventory WHERE Item='book';
//一些计算写在这里
UPDATE inventory SET Quantity=11 WHERE Item='book';
UNLOCK TABLES

Aquí, usamos una declaración de selección para obtener los datos iniciales y, a través de algunos cálculos, actualizamos el nuevo valor de la tabla con una declaración de actualización. La instrucción LOCK TABLE que contiene la palabra clave WRITE puede garantizar que no habrá otro acceso para insertar, actualizar o eliminar el inventario antes de que se ejecute el comando UNLOCK TABLES.

Seis, usa claves externas

El método de bloquear la tabla puede mantener la integridad de los datos, pero no puede garantizar la relevancia de los datos. En este momento podemos usar claves foráneas.

Por ejemplo, las claves externas pueden garantizar que cada registro de ventas apunte a un cliente existente. Aquí, la clave externa puede asignar el CustomerID en la tabla customerinfo al CustomerID en la tabla salesinfo Cualquier registro sin un CustomerID válido no se actualizará ni se insertará en salesinfo.

 
CREATE TABLE customerinfo( CustomerID INT NOT NULL,PRIMARYKEY(CustomerID)) TYPE=INNODB;
CREATE TABLE salesinfo( SalesID INT NOT NULL,CustomerID INT NOT NULL,PRIMARYKEY(CustomerID,SalesID),
FOREIGN KEY(CustomerID)REFERENCES customerinfo(CustomerID)ON DELETE CASCADE)TYPE=INNODB;

Tenga en cuenta el parámetro "ON DELETE CASCADE" en el ejemplo. Este parámetro garantiza que cuando se elimina un registro de cliente en la tabla customerinfo, todos los registros relacionados con el cliente en la tabla salesinfo también se eliminarán automáticamente.
Si desea utilizar claves externas en MySQL, debe recordar definir el tipo de tabla como el tipo InnoDB seguro para transacciones cuando cree la tabla. Este tipo no es el tipo predeterminado de tablas MySQL. El método de definición es agregar TYPE = INNODB a la declaración CREATETABLE. Como se muestra en el ejemplo.

Siete, usa el índice

La indexación puede usar la primera letra A, B, C ... dispuesta en el diccionario para ayudar a comprender, por ejemplo, cuando agregamos un índice a los datos, podemos encontrar rápidamente los datos basados ​​en la "letra inicial" en lugar de cada elemento Ir a buscar.
Especialmente cuando la instrucción de consulta contiene comandos MAX (), MIN () y ORDERBY, el uso de índices puede mejorar el rendimiento de la base de datos de manera más significativa.

¿Qué campos deben indexarse?

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

El funcionamiento detallado del índice y la diferencia entre el índice de una sola columna y el índice combinado se pueden encontrar en el siguiente enlace (Exámenes frecuentes para la entrevista del programa Ape)
https://blog.csdn.net/S_ZaiJiangHu/article/details/114420976

8. Declaración de consulta optimizada

En la mayoría de los casos, el uso de índices puede mejorar la velocidad de las consultas, pero si la instrucción SQL no se usa correctamente, el índice no podrá desempeñar el papel que le corresponde.

Los siguientes son algunos aspectos a los que se debe prestar atención.

En primer lugar, es mejor comparar operaciones entre campos del mismo tipo.

Antes de MySQL 3.23, esta era incluso una condición necesaria. Por ejemplo, un campo INT indexado no se puede comparar con un campo BIGINT; sin embargo, como caso especial, cuando el tamaño de campo de un campo de tipo CHAR y un campo de tipo VARCHAR son iguales, se pueden comparar.

En segundo lugar, intente no utilizar funciones para operaciones en campos indexados.

Por ejemplo, cuando se utiliza la función YEAE () en un campo de tipo FECHA, el índice no funcionará como debería. Por lo tanto, aunque las dos consultas siguientes devuelven los mismos resultados, la última es mucho más rápida que la primera.

En tercer lugar, cuando buscamos campos de caracteres, a veces usamos palabras clave LIKE y comodines.Aunque este enfoque es simple, también se produce a expensas del rendimiento del sistema.
Por ejemplo, la siguiente consulta comparará todos los registros de la tabla.

SELECCIONAR * DELibros

DONDEnombrecomo "MySQL%"

Pero si cambia a la siguiente consulta, el resultado será el mismo, pero la velocidad será mucho más rápida:

SELECCIONAR * DELibros

WHEREname > = "MySQL" y nombre < "MySQM"

Por último, se debe tener cuidado para evitar que MySQL realice una conversión automática de tipos en la consulta, porque el proceso de conversión también hará que el índice no funcione.

Supongo que te gusta

Origin blog.csdn.net/S_ZaiJiangHu/article/details/114414778
Recomendado
Clasificación