Optimización de Mysql eliminando una gran cantidad de datos en una tabla grande

Supongamos que hay una tabla con 30 millones de registros y todos los registros con estado = 1 deben eliminarse sin detener el negocio, hay casi 6 millones de registros.

Si usa directamente eliminar de tab_name donde estado = 1, se activará el error de exceder el tiempo de espera de bloqueo, porque esta declaración involucra demasiados registros.

1. La diferencia entre soltar, truncar y eliminar:

gota

truncar

borrar

Proceso de implementación

Declaración DDL, elimina toda la tabla y la estructura de la tabla, así como los índices, restricciones y activadores de la tabla.

Las declaraciones DDL solo eliminan datos de la tabla y se conservarán la estructura de la tabla, los índices, las restricciones, etc.

Declaración DML, eliminar datos en la tabla.

Retroceder

no poder

no poder

Poder

asuntos

Sin transacciones, sin bloqueos de tablas y sin una gran cantidad de registros escritos en archivos de registro;

Libere espacio en disco inmediatamente después de truncar la tabla nombre_tabla y restablezca el valor de incremento_automático.

La transacción se registrará en el registro y hay bloqueos de fila y tabla;

eliminar no libera espacio en el disco, pero las inserciones posteriores sobrescribirán los datos eliminados previamente.

Eficiencia de ejecución: soltar > truncar > eliminar

2. Esquema de eliminación del límite de lotes:

DELETE FROM tab_name WHERE status=1 ORDER BY status LIMIT 10000;

Nota: Cuando necesite utilizar el orden mediante clasificación, debe utilizar el orden por + límite juntos; de lo contrario, el optimizador optimizará el orden por y lo considerará sin sentido.

Nota: Si la declaración de eliminación donde no está en el índice, puede encontrar primero la clave principal y luego eliminar la base de datos de acuerdo con la clave principal.

1) Ventajas de agregar límite:

  1. Reduzca el costo de escribir SQL incorrecto, incluso si elimina el incorrecto, como el límite 500, perderá 500 datos, lo cual no es fatal y los datos se pueden recuperar rápidamente a través de binlog.
  2. Para evitar transacciones largas, MySQL agregará bloqueos de escritura y bloqueos de espacio (bloqueos de espacio) a todas las filas involucradas cuando se ejecute la eliminación, y todas las filas relacionadas con la ejecución de la declaración DML se bloquearán. Si el número de eliminaciones es grande, afectará directamente la inutilizabilidad de negocios relacionados.
  3. Cuando la cantidad de datos eliminados es grande, es fácil llenar la CPU sin agregar el límite, lo que resulta en una eliminación más lenta.

Para el segundo punto anterior, la premisa es que se agrega un índice al statusid. Como todos sabemos, el bloqueo se basa en el índice. Si el campo statusid no está indexado, se escaneará hasta el índice de clave principal. Incluso si solo hay un registro con statusid = 1. También bloqueará la tabla.

2) Definitivamente es un buen hábito usar limit1 para operaciones de eliminación y actualización únicas:

Para una única operación de actualización y eliminación, si hay un límite de 1 en el SQL, entonces se requiere la devolución; de lo contrario, se realizará un escaneo completo de la tabla antes de la devolución. La eficiencia habla por sí sola.

 3. Cambiar el nombre del esquema:

Una tabla tiene 160 millones de datos y un ID de incremento automático. El valor máximo es 160 millones. Es necesario eliminar datos mayores a 2,5 millones. ¿Hay alguna forma de eliminarlos rápidamente?

Consulte los documentos de MySQL para obtener una solución: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Al eliminar varias filas de datos en una tabla grande, se excederá el límite del tamaño de la tabla de bloques innod. La solución para minimizar el tiempo de bloqueo de la tabla es:

1) Seleccione los datos que no es necesario eliminar y guárdelos en una tabla vacía con la misma estructura.

INSERT INTO t_copy SELECT * FROM t WHERE ... ;

2) Utilice la operación atómica cambiar nombre para cambiar el nombre de la tabla original y la tabla de copia

RENAME TABLE t TO t_old, t_copy TO t;

3) Eliminar la tabla original.

DROP TABLE t_old;

4. Reconstruir después de eliminar índices innecesarios

En el uso de la base de datos My SQL algunas tablas almacenan una cantidad relativamente grande de datos, llegando a unos 3 millones de registros por día, en esta tabla se establecen tres índices, estos índices son necesarios y deben ser utilizados por otros programas. Dado que los datos de esta tabla solo son necesarios para conservar los datos del día actual, siempre que otros programas hayan procesado los datos de la tabla en un momento determinado de la mañana, deberá eliminar los datos de ayer y del día anterior en el tabla y use eliminar para eliminar cientos de datos en la tabla. Cuando hay 10,000 registros, la velocidad de eliminación de MySQL es muy lenta. Se necesitan aproximadamente 4 minutos por cada 10,000 registros. Se necesitan más de ocho horas para eliminar todos los datos inútiles. , lo cual es inaceptable.

Consulte el manual oficial de MySQL para saber que la velocidad de eliminación de datos es directamente proporcional a la cantidad de índices creados (para operaciones DML, si hay un índice, la información del índice se actualizará, por lo que será más lento), así que eliminé dos de los índices y probado y encontrado En este momento, la velocidad de eliminación es bastante rápida y lleva más de un minuto para 1 millón de registros. Sin embargo, estos dos módulos de índice todavía se usan en la clasificación de datos una vez al día, así que pensé de un método de compromiso:

  1. Elimine estos dos índices antes de eliminar los datos, lo que lleva un poco más de tres minutos;
  2. Luego borra los datos inútiles, este proceso toma menos de dos minutos;
  3. Vuelva a crear el índice una vez completada la eliminación, porque los datos en la base de datos son relativamente pequeños en este momento, entre 300.000 y 400.000 registros (los datos de esta tabla aumentarán en aproximadamente 100.000 registros por hora), y la creación del índice es También muy rápido, unos diez minutos aproximadamente. Todo este proceso de eliminación sólo lleva unos 15 minutos. En comparación con las ocho horas anteriores, ahorra mucho tiempo.

Supongo que te gusta

Origin blog.csdn.net/liuxiao723846/article/details/130360635
Recomendado
Clasificación