Mysql-about SQL adiciones, eliminaciones, modificaciones y optimización de la creación de tablas

Mysql-Optimización de adiciones, eliminaciones y modificaciones de SQL

①Inserte datos a granel

Si realiza una gran cantidad de inserciones al mismo tiempo, se recomienda utilizar la instrucción INSERT con varios valores (método 2). Esto es más rápido que usar instrucciones INSERT por separado (método uno). Generalmente, la eficiencia de la inserción de lotes es varias veces diferente.

método uno:

insert into T values(1,2); 
 
insert into T values(1,3); 
 
insert into T values(1,4);

Método dos:

Insert into T values(1,2),(1,3),(1,4); 

Hay tres razones para elegir este último método:

Reducir las operaciones de análisis de sentencias de SQL. MySQL no tiene un grupo de recursos compartidos similar a Oracle. Con el método dos, los datos solo se pueden insertar analizando una vez.

En ciertos escenarios, se puede reducir el número de conexiones a la base de datos.

La instrucción SQL es más corta, lo que puede reducir el IO de la transmisión de red.

② Utilice el compromiso de forma adecuada

El uso apropiado de la confirmación puede liberar los recursos ocupados por la transacción y reducir el consumo. Los recursos que se pueden liberar después de la confirmación son los siguientes:

事务占用的 undo 数据块。

事务在 redo log 中记录的数据块。

释放事务施加的,减少锁争用影响性能。特别是在需要使用 delete 删除大量数据的时候,必须分解删除量并定期 commit。

③ Evite la consulta repetida de datos actualizados

En respuesta a la necesidad de actualizar filas que aparecen a menudo en el negocio y quieren obtener información de cambio de fila, MySQL no admite la sintaxis UPDATE RETURNING como PostgreSQL, que se puede implementar a través de variables en MySQL.

Por ejemplo, actualice la marca de tiempo de una fila de registros y desee consultar cuál es la marca de tiempo almacenada en el registro actual.

Método simple para lograr:

Update t1 set time=now() where col1=1; 

Select time from t1 where id =1;

El uso de variables se puede reescribir de la siguiente manera:

Update t1 set time=now () where col1=1 and @now: = now (); 

Select @now; 

Tanto el anverso como el reverso requieren dos recorridos de red, pero el uso de variables evita volver a visitar la tabla de datos, especialmente cuando la tabla t1 tiene una gran cantidad de datos, la última es mucho más rápida que la primera.

④ Prioridad de consulta o prioridad de actualización (insertar, actualizar, eliminar)

MySQL también permite cambiar la prioridad de la programación de declaraciones, lo que puede hacer que las consultas de varios clientes funcionen mejor juntas para que un solo cliente no espere mucho tiempo debido a bloqueos. Cambiar la prioridad también puede garantizar que ciertos tipos de consultas se procesen más rápido.

Primero debemos determinar el tipo de aplicación, determinar si la aplicación está basada en consultas o basada en actualizaciones, ya sea para garantizar la eficiencia de las consultas o la eficiencia de las actualizaciones, y decidir si la prioridad de la consulta o la prioridad de actualización.

El método para cambiar la estrategia de programación que se menciona a continuación es principalmente para motores de almacenamiento que solo tienen bloqueos de tabla, como MyISAM, MEMROY y MERGE. Para los motores de almacenamiento Innodb, la ejecución de declaraciones se determina por el orden en el que se encuentran los bloqueos de fila. adquirido.

La estrategia de programación predeterminada de MySQL se puede resumir de la siguiente manera:

Las operaciones de escritura tienen prioridad sobre las operaciones de lectura.

Una operación de escritura en una determinada tabla de datos solo puede ocurrir una vez en un momento determinado, y las solicitudes de escritura se procesan en el orden en que llegan.

Se pueden realizar simultáneamente varias operaciones de lectura de una determinada tabla de datos.

MySQL proporciona varios modificadores de declaraciones que le permiten modificar su estrategia de programación:

La palabra clave LOW_PRIORITY se aplica a DELETE, INSERT, LOAD DATA, REPLACE y UPDATE.

La palabra clave HIGH_PRIORITY se aplica a las instrucciones SELECT e INSERT.

La palabra clave DELAYED se aplica a las instrucciones INSERT y REPLACE.

Si la operación de escritura es una solicitud LOW_PRIORITY (prioridad baja), entonces el sistema no considerará su prioridad más alta que la operación de lectura.

En este caso, si el segundo lector llega mientras el escritor está esperando, entonces el segundo lector puede insertar antes que el escritor.

Los escritores pueden iniciar operaciones solo cuando no hay otros lectores. Este tipo de modificación de programación puede hacer que la operación de escritura LOW_PRIORITY se bloquee para siempre.

La palabra clave HIGH_PRIORITY (prioridad alta) de la consulta SELECT es similar. Permite insertar SELECT antes de la operación de escritura en espera, incluso si la prioridad de la operación de escritura es mayor en circunstancias normales.

Otro efecto es que los SELECT de alta prioridad se ejecutan antes que las sentencias SELECT normales, porque estas sentencias serán bloqueadas por operaciones de escritura.

Si desea que todas las declaraciones que admiten la opción LOW_PRIORITY se procesen con prioridad baja de forma predeterminada, utilice la opción –low-priority-updates para iniciar el servidor.

Al usar INSERTHIGH_PRIORITY para aumentar la instrucción INSERT a la prioridad de escritura normal, se puede eliminar el efecto de esta opción en una sola instrucción INSERT.

Optimización de la condición de consulta

①Para consultas complejas, puede usar tablas temporales intermedias para almacenar datos temporalmente

②Optimizar el grupo por declaración

Por defecto, MySQL ordenará todos los valores del grupo GROUP BY, como "GROUP BY col1, col2, ...;" El método de consulta es el mismo que especificar "ORDER BY col1, col2, ...; "en la consulta.

Si incluye explícitamente una cláusula ORDER BY que contiene las mismas columnas, MySQL puede optimizarla sin ralentizarse, aunque todavía esté ordenada.

Por lo tanto, si la consulta incluye GROUP BY pero no desea ordenar los valores agrupados, puede especificar ORDER BY NULL para prohibir la ordenación.

P.ej:

SELECT col1, col2, COUNT(*) FROM table GROUP BY col1, col2 ORDER BY NULL ;

③Optimizar la declaración de unión

En MySQL, puede usar la instrucción SELECT para crear un resultado de consulta de una sola columna a través de una subconsulta y luego usar este resultado como condición de filtro en otra consulta.

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 bloqueos 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) ...

Ejemplo: suponga que desea eliminar a todos los usuarios que no tienen registros de pedidos, puede utilizar la siguiente consulta para completar:

SELECT col1 FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

Si usa JOIN ... para completar esta consulta, se mejorará la velocidad.

Especialmente cuando hay un índice de CustomerID en la tabla salesinfo, el rendimiento será mejor. La consulta es la siguiente:

SELECT col1 FROM customerinfo 
   LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.CustomerID 
      WHERE salesinfo.CustomerID IS NULL

JOIN ... La razón por la que 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.

④Optimizar consulta de unión

MySQL ejecuta consultas de unión creando y llenando tablas temporales. A menos que realmente desee eliminar las filas duplicadas, se recomienda unir todo .

La razón es que si no hay una palabra clave all, MySQL agregará la opción distinta a la tabla temporal, lo que resultará en la unicidad de los datos en toda la tabla temporal, lo cual es bastante caro.

Eficiente:

SELECT COL1, COL2, COL3 FROM TABLE WHERE COL1 = 10 
 
UNION ALL 
 
SELECT COL1, COL2, COL3 FROM TABLE WHERE COL3= 'TEST';

Ineficiente:

SELECT COL1, COL2, COL3 FROM TABLE WHERE COL1 = 10 
 
UNION 
 
SELECT COL1, COL2, COL3 FROM TABLE WHERE COL3= 'TEST';

⑤ Divida SQL complejo en múltiples SQL pequeños para evitar grandes transacciones

como sigue:

SQL simple es fácil de usar QUERY CACHE de MySQL.

Reduzca el tiempo de la tabla de bloqueo, especialmente la tabla que utiliza el motor de almacenamiento MyISAM.

Se puede utilizar una CPU de varios núcleos.

⑥ Utilice truncar en lugar de eliminar

Al eliminar registros en toda la tabla, las operaciones que utilizan la declaración de eliminación se registrarán en el bloque de deshacer, y la eliminación de registros también se registrará en binlog.

当确认需要删除全表时,会产生很大量的 binlog 并占用大量的 undo 数据块,此时既没有很好的效率也占用了大量的资源。

使用 truncate 替代,不会记录可恢复的信息,数据不能被恢复。也因此使用 truncate 操作有其极少的资源占用与极快的时间。另外,使用 truncate 可以回收表的水位,使自增字段值归零。

⑦ Utilice métodos de paginación razonables para mejorar la eficiencia de la paginación

Utilice un método de paginación razonable para mejorar la eficiencia de la paginación Para la visualización y otras necesidades de paginación, un método de paginación adecuado puede mejorar la eficiencia de la paginación.

Caso 1:

select * from t where thread_id = 10000 and deleted = 0 
   order by gmt_create asc limit 0, 15;

En el ejemplo anterior, todos los campos se ordenan y devuelven de acuerdo con las condiciones del filtro al mismo tiempo. Sobrecarga de acceso a datos = IO de índice + IO de datos de tabla correspondiente a todos los registros de índice.

Por lo tanto, cuanto más se invierta este método de escritura, peor será la eficiencia de ejecución y mayor será el tiempo, especialmente cuando la cantidad de datos de la tabla es grande.

Escenarios aplicables: aplicable cuando el conjunto de resultados intermedios es pequeño (menos de 10.000 filas) o las condiciones de consulta son complejas (se refieren a varios campos de consulta diferentes o combinaciones de varias tablas).

Caso 2:

select t.* from (select id from t where thread_id = 10000 and deleted = 0
   order by gmt_create asc limit 0, 15) a, t 
      where a.id = t.id;

El ejemplo anterior debe satisfacer que la clave principal de la tabla t es la columna id, y hay una clave secundaria del índice de cobertura: (thread_id, deleted, gmt_create).

Saque el ID de la clave principal según la condición del filtro utilizando el índice de cobertura para ordenar y luego realice la operación de unión para eliminar otros campos.

Costo de acceso a los datos = índice IO + resultado de paginación del índice (15 filas en el ejemplo) correspondiente a los datos de la tabla IO. Por lo tanto, este método de escritura consume básicamente los mismos recursos y tiempo cada vez que se pasa la página, al igual que se pasa la primera página.

Escenarios aplicables: cuando los campos de consulta y clasificación (es decir, los campos involucrados en la cláusula where y la cláusula order by) tienen un índice de cobertura correspondiente y el conjunto de resultados intermedios es grande, es aplicable.

Optimización de la construcción de mesas (muy importante)

①Crear un índice en la tabla y dar prioridad a los campos usados ​​por dónde y ordenar por.

② Intente utilizar campos numéricos (como género, masculino: 1, femenino: 2) y trate de no diseñar campos que contengan solo información numérica como tipos de caracteres, lo que reducirá el rendimiento de la consulta y la conexión y aumentará la sobrecarga de almacenamiento.

Esto se debe a que el motor compara cada carácter de la cadena uno por uno al procesar consultas y concatenaciones. Para los tipos numéricos, solo una comparación es suficiente.

③ Consultar tablas con una gran cantidad de datos provocará consultas lentas. La razón principal es que hay demasiadas líneas de escaneo. En este momento, puede consultar por programa, segmento y página, recorrer el bucle y fusionar los resultados para mostrarlos.

Para consultar los datos de 100000 a 100050, de la siguiente manera:

SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t 
WHERE t.rowid > 100000 AND t.rowid <= 100050

④ Utilice varchar / nvarchar en lugar de char / nchar.

Utilice varchar / nvarchar en lugar de char / nchar tanto como sea posible, porque el espacio de almacenamiento de los campos de longitud variable es pequeño, lo que puede ahorrar espacio de almacenamiento.En segundo lugar, para las consultas, la eficiencia de búsqueda en un campo relativamente pequeño es obviamente mayor.

No creas que NULL no necesita espacio. Por ejemplo: tipo char (100). Cuando se crea el campo, el espacio es fijo. Independientemente de si el valor se inserta o no (también se incluye NULL), ocupará 100 caracteres de espacio Si es un varchar Para tales campos de longitud variable, nulo no ocupa espacio.

Supongo que te gusta

Origin blog.csdn.net/weixin_43941676/article/details/113941013
Recomendado
Clasificación