¿Cómo elimina MySQL tablas grandes con elegancia?


Con el paso del tiempo o el crecimiento del volumen de negocios, la tasa de utilización del espacio de la base de datos también ha aumentado constantemente.Cuando el espacio de la base de datos está a punto de llegar al cuello de botella, ¡podemos encontrar que la base de datos tiene una o dos tablas súper grandes! Han acumulado todos los datos desde el inicio del negocio hasta el presente, pero el 90% de los datos no tienen valor comercial ¿Cómo lidiar con estas grandes tablas en este momento?

Dado que son datos sin valor, generalmente elegimos eliminarlos directamente o eliminarlos después de archivarlos.Los métodos de operación para la eliminación de datos se pueden dividir en dos categorías:

  • Elimine directamente todos los datos de la tabla mediante truncar
  • Eliminar los registros que cumplen las condiciones de la tabla mediante eliminar

Uno, truncar operación

En un sentido lógico, la operación de truncar es eliminar todas las filas de la tabla, pero no es lo mismo que eliminar de table_name wehre 1 = 1. Para mejorar el rendimiento de eliminar todos los datos de la tabla, la operación de truncar es en realidad eliminar la tabla primero y luego volver a crear la tabla. Debido a esto, la operación de truncar es una operación DDL de no reversión.

1.1 ¿Qué hace MySQL truncate?

  • La operación de truncar se divide en dos pasos: soltar y volver a crear
  • La primera etapa de la operación de eliminación es el proceso de borrar las páginas del grupo de búfer. Las páginas de datos relacionadas con la tabla se eliminan de la cadena de descarga sin necesidad de realizar una operación de descarga. El cuello de botella de este paso es principalmente que la operación de eliminación de la cola de vaciado debe mantener el bloqueo de la instancia del grupo de búfer correspondiente y realizar una búsqueda transversal. Si la instancia del grupo de búfer es relativamente grande y hay muchas páginas de datos que deben eliminarse en la cadena de descarga, esta operación hará que se eliminen otras transacciones. La obtención del bloqueo de la instancia del grupo de búfer está bloqueada, lo que afecta el rendimiento de la base de datos
  • La segunda etapa de la operación de eliminación es el proceso de eliminación de archivos de disco ibd. Cuanto mayor sea el archivo físico de la base de datos eliminada, mayor será el consumo de recursos de E / S y más tiempo llevará la operación de eliminación.
  • En la etapa de operación de recreación, siempre que el archivo .frm de la tabla eliminada esté intacto, se puede reconstruir de acuerdo con la información de la estructura de la tabla original después de la eliminación de la tabla, y el valor de auto_increment de la tabla se restablecerá después de la reconstruir

1.2 ¿Cómo optimizar el consumo de recursos provocado por la operación de truncado?

  • Para la primera etapa de la tabla de caída en la operación de truncar, cuando el innodb_buffer_pool_size asignado a la instancia de MySQL excede 1GB, configure el parámetro innodb_buffer_pool_instances razonablemente para mejorar la simultaneidad y reducir la ocupación de recursos de bloqueo que consume mucho tiempo al escanear la instancia del grupo de búfer disfrazado.
  • Para la segunda etapa de la eliminación de la tabla en la operación de truncar, antes de eliminar la tabla correspondiente, cree un enlace duro al archivo .ibd de la tabla modificada para acelerar la eficiencia de ejecución de la operación de eliminación en el nivel de MySQL y reducir el rendimiento. pérdida en el nivel de la base de datos. Seguimiento para limpiar manualmente las conexiones duras que hicimos a nivel del sistema operativo

Dos, operación de eliminación

2.1 ¿Qué operaciones hace MySQL delete?

  • Realice un escaneo de índice / tabla completa en la tabla eliminada de acuerdo con la condición where para verificar si se cumple la condición where. Esta etapa bloqueará todas las filas en el escaneo. Esta etapa es el mayor peligro oculto del consumo de recursos. Si la cantidad de datos en la tabla es grande y la operación de eliminación no puede usar el índice de manera efectiva para reducir la cantidad de datos escaneados, este paso traerá una gran contención de bloqueos y recursos cpu / io consumo a la base de datos.
  • Los bloqueos impuestos en las filas que no pueden coincidir con la condición where se liberarán después de que se verifique la condición, e InnoDB solo bloquea las filas que deben eliminarse. Esto puede reducir efectivamente la contención de bloqueos, pero una cosa a la que aún debemos prestar atención es que eliminar una gran cantidad de datos a la vez generará un enorme registro de transacciones binlog, que es tanto para MySQL como para las bibliotecas esclavas en el maestro. arquitectura esclava Es hostil y puede causar retrasos en la replicación.

2.2 ¿Cómo optimizar la operación de eliminación?

  • Eliminar toda la tabla La operación de eliminación debe ser cautelosa, considere usar la operación de truncar
  • En eliminar ... donde ..., donde las condiciones de filtro intentan garantizar que los índices se puedan utilizar de forma eficaz para reducir la cantidad de análisis de datos y evitar análisis completos de tablas
  • Para la eliminación de datos a gran escala y donde las condiciones no están indexadas, la operación de eliminación puede agregar una clave primaria de crecimiento automático adicional o un campo de tiempo con un índice, y realizar operaciones de eliminación por lotes. Una pequeña cantidad de datos se elimina cada vez y se ejecuta en varios lotes.
  • Para el escenario clásico de retener datos recientes y eliminar datos históricos, puede crear la misma estructura de la tabla xxx_tmp y usar la operación insertar xxx_tmp select ... para retener los datos requeridos en la tabla tmp, y luego usar la operación de cambio de nombre para reemplazar la tabla de negocios actual xxx con la tabla xxx_bak, xxx_tmp Reemplace la tabla con el nombre de la tabla de negocios actual xxx, y luego elimine manualmente la tabla grande inútil xxx_bak

2.3 Dos escenarios comunes para eliminar

2.3.1 eliminar donde la condición no tiene un filtrado de índice válido

Un escenario más común es que el valor de t1 condition1 = xxx debe eliminarse en la empresa y el campo de condición no puede usar el índice de manera efectiva. En este caso, nuestra práctica habitual es:

  • Vea los índices que se pueden usar de manera efectiva en la estructura de la tabla actual, intente ser la clave primaria de crecimiento automático o el campo de índice de tiempo de la tabla
  • Utilice eficazmente el índice de clave principal o el índice de tiempo de crecimiento automático, agregue la operación de eliminación al filtro de rango del campo de índice, elimine una pequeña cantidad de datos cada vez y ejecútelo en varios lotes. Los lotes específicos deben evaluarse en función de las condiciones comerciales reales para evitar eliminar grandes lotes de datos a la vez.
-- 利用自增长主键索引
delete from t1 where condition1=xxx and id >=1 and id < 50000;
delete from t1 where condition1=xxx and id >=50000 and id < 100000;


-- 利用时间索引
delete from t1 where condition1=xxx and create_time >= '2021-01-01 00:00:00' and create_time < '2021-02-01 00:00:00';
delete from t1 where condition1=xxx and create_time >= '2021-02-01 00:00:00' and create_time < '2021-03-01 00:00:00';

2.3.2 Conservar datos recientes y eliminar datos históricos

Uno de los escenarios más comunes es mantener solo los últimos 3 meses de datos en la tabla t1 y eliminar el resto de los datos históricos. Nuestro enfoque habitual es:

  • Cree una tabla t1_tmp para almacenar temporalmente los datos que deben retenerse
create table t1_tmp like t1;
  • De acuerdo con el campo de tiempo indexado, escriba los datos que deben retenerse en la tabla t1_tmp en lotes. Cabe señalar que la operación del último lote de tiempo no se puede procesar temporalmente.
-- 根据实例业务数量进行分批,尽量每批次处理数据量不要太大
insert into t1_tmp select * from t1 where create_time >= '2021-01-01 00:00:00' and create_time < '2021-02-01 00:00:00';
insert into t1_tmp select * from t1 where create_time >= '2021-02-01 00:00:00' and create_time < '2021-03-01 00:00:00';

-- 当前最后一批次数据先不操作
-- insert into t1_tmp select * from t1 where create_time >= '2021-03-01 00:00:00' and create_time < '2021-04-01 00:00:00';
  • Utilice la operación de cambio de nombre para reemplazar la tabla de negocios actual t1 con la tabla t1_bak y reemplace la tabla t1_tmp con el nombre de la tabla de negocios actual t1. Si la tabla eliminada tiene operaciones DML frecuentes, este paso provocará fallas temporales de acceso comercial
alter table t1 rename to t1_bak;
alter table t1_tmp rename to t1;
  • Escribe el último lote de datos en la tabla de negocios actual. El propósito de este paso es reducir la pérdida de datos en el proceso de operación de cambio.
insert into t1 select * from t1_bak where create_time >= '2021-03-01 00:00:00' and create_time < '2021-04-01 00:00:00';
  • En el paso de la operación de cambio de nombre, una cosa más a la que debemos prestar atención es si la clave principal de la tabla de cambios es de aumento automático o el único uuid de la empresa. Si es una clave principal de aumento automático, también debemos preste atención a modificar el valor auto-creciente de la tabla t1_tmp para asegurarse de que el valor de ajuste final contenga Escritura de datos durante el cambio
alter table t1_tmp auto_increment={t1表当前auto值}+{变更期间预估增长值}

3. Comparación de ventajas y desventajas de Truncar / Eliminar

Tipo de operación descripción Ventaja Desventaja
Truncar Operación de eliminación completa de la tabla No es necesario escanear los datos de la tabla, alta eficiencia de ejecución, eliminación física directa, liberación rápida del espacio ocupado Las operaciones DDL no se pueden revertir y no se pueden eliminar según las condiciones
Borrar Filtrar y eliminar operaciones según condiciones especificadas Se puede filtrar y eliminar de acuerdo con las condiciones especificadas. La eficiencia de eliminación depende de la escritura de las condiciones where. La eliminación de tablas grandes producirá una gran cantidad de binlogs y la eficiencia de eliminación es baja. La operación de eliminación puede tener más espacio fragmentado en lugar de liberar directamente el espacio

Supongo que te gusta

Origin blog.csdn.net/weixin_37692493/article/details/115283520
Recomendado
Clasificación