Estoy ejecutando MySQL5.5 con replicación Maestro / Esclavo (1 maestro, 2 esclavos).
Tengo un proceso que se ejecuta una vez por semana y trunca una tabla específica. La tabla no es grande y solo tiene unos pocos miles de registros.
Por alguna razón, el TRUNCATE TABLEcomando tarda mucho tiempo en ejecutarse (tanto en el maestro como en el esclavo). ¡Se tarda unos 400K ms en ejecutarse! Cuando se ejecuta en el esclavo, hace que se retrase del Maestro. Después de los TRUNCATE TABLEacabados, todo vuelve a la normalidad.
Sé que uno de los esclavos no recibió ninguna lectura mientras realizaba, TRUNCATE TABLEya que es un esclavo dedicado y el proceso que lee de ese esclavo estaba inactivo. Además, en este esclavo, llevó la misma cantidad de tiempo ejecutarlo.
Aquí está la estructura de la tabla: http://pastebin.com/qEQB4juR
¿Alguna idea sobre cómo puedo acelerar la TABLA DE TRUNCADO?
fuente

Respuestas:
El uso
TRUNCATE TABLEen una tabla InnoDB requiere un bloqueo completo de la tabla porque TRUNCATE TABLE es DDL (Lenguaje de definición de datos) no DML (Manipulación de datos).Hacerlo
DELETE FROM user_engagements;no ayudará porque la información de MVCC está escrita en los registros de deshacer en ibdata1, y eso puede retrasar el vaciado de la tabla. Si las transacciones no confirmadas se mantienenuser_engagements, eso podría retrasarTRUNCATE TABLEtambién a.Puede cambiar el nombre de la tabla para que esté disponible de inmediato.
Esto debería replicarse rápidamente a excepción de la última declaración.
Darle una oportunidad !!!
Si tiene MySQL 5.1.16+,
TRUNCATE TABLErequiere privilegio DROP . Mi respuesta realiza lo queTRUNCATE TABLEahora hace.Si tiene MySQL 5.1.15 y versiones anteriores, necesita el privilegio DELETE , que cubre mi respuesta.
fuente
RENAME TABLEdeclaración de varias partes en lugar deALTER TABLEpara hacer que el cambio de nombre sea atómico:RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;otra consideración es queDROP TABLEhace que LRU_mutex se bloquee mientras se escanea la lista LRU y se elimina cada entrada; esto detendrá su servidor. Percona Server tieneinnodb_lazy_drop_tableque ayudar con esto, peroDROP TABLEaún puede llevar mucho tiempo en sistemas de archivos ext.truncate tableestá tomando mucho tiempo debido a las particiones en la tabla (1000), puedo eliminarlas si eso conduce a la solución?