Tenemos una mesa (en la actualidad InnoDB), que contiene aproximadamente 500.000 filas. Esto representa una cola de tareas para ejecutar. Se almacena en una base de datos MySQL.interbloqueos en MySQL filas eliminación
Una forma continua, al menos una vez por segundo, pero a veces con más frecuencia, seleccionamos los datos de ella y posteriormente actualizar algunas filas. Una vez por día, podamos filas antiguas de la tabla.
empezamos a recibir los puntos muertos sobre la mesa y esto trajo nuestra procesamiento de tareas a un punto muerto. Estos bloqueos se produjeron durante la corrida de ciruela nocturna. La combinación de DELETE, SELECT y UPDATE significó que esencialmente nada productivo podría suceder. Desafortunadamente no tengo la salida de un SHOW ENGINE INNODB STATUS.
Me gustaría saber la mejor opción para tratar con esto. Tenga en cuenta que nuestro código detecta interbloqueos y vuelve a enviar la consulta. Además, hace tiempo descubrimos que eliminar todas las filas coincidentes a la vez era demasiado exigente en una tabla de base de datos que mostraba mucha actividad, por lo que LIMITAMOS nuestras eliminaciones a 10.000 filas a la vez y seguimos volviendo a enviar la consulta hasta que se hayan completado todas las filas necesarias podado
veo las siguientes opciones, y nos gustaría comentarios sobre cuáles son las mejores, o sugerencias para otras opciones:
- Eliminar un menor número de filas a la vez
- Uso retroceso exponencial en nuestros eliminaciones, aunque yo a mí respecta
- LOCK TABLES que esto no ayuda dada nuestra carga de trabajo específica como por MySQL documentation. Probablemente podríamos aceptar el bloqueo de las instrucciones SELECT y UPDATE durante la duración de las eliminaciones.
- Cambie al tipo de tabla MyISAM. Fuimos con InnoDB porque inicialmente estábamos usando transacciones en esta tabla. Este ya no es el caso. No estoy lo suficientemente familiarizado con los detalles para saber si esta es una solución viable.
- quizás al uso LOW_PRIORITY UPDATE. Puede ser que los DELETE no afecten a los SELECT, solo a las ACTUALIZACIONES, y esto puede ser suficiente.
Todos los interbloqueos que he encontrado se deben a transacciones no confirmadas. Asegúrese de que está ejecutando correctamente las transacciones (ya sea con confirmación automática activada o confirmación automática desactivada y la gestión real de confirmaciones/reversiones). – localshred
Definitivamente es un buen punto; este sería el caso la mayor parte del tiempo, pero en realidad no estamos haciendo transacciones en esta mesa. Solíamos, pero ya no hacemos. – ChrisInEdmonton