sql >> Base de Datos >  >> RDS >> Mysql

MySQL/InnoDB y consultas de larga duración

En primer lugar, creo que sería útil como base leer sobre control de concurrencia multiversión (MVCC) como trasfondo de esta respuesta.

InnoDB implementa MVCC, lo que significa que puede usar lecturas sin bloqueo para SELECT regulares . Esto no requiere crear una "instantánea" y, de hecho, InnoDB no tiene ningún concepto real de una instantánea como objeto. En cambio, cada registro en la base de datos realiza un seguimiento de su propio número de versión y mantiene un "puntero de rollo" a un registro de "registro de deshacer" (que puede o no existir) que modifica la fila a su versión anterior. Si se necesita una versión anterior de un registro, se lee la versión actual y se siguen esos punteros y se deshacen los registros aplicados hasta que se produzca una versión suficientemente antigua del registro.

Normalmente, el sistema limpia constantemente esos registros de deshacer y reutiliza el espacio que consumen.

En cualquier momento cualquier transacción de larga duración (nota, no necesariamente una sola consulta), los registros de deshacer deben mantenerse (no purgarse) para recrear versiones lo suficientemente antiguas de todos los registros para satisfacer esa transacción. En un sistema muy ocupado, esos registros de deshacer pueden acumularse muy rápidamente para consumir gigabytes de espacio. Además, si los registros individuales específicos se modifican con mucha frecuencia, revertir ese registro a una versión lo suficientemente antigua para satisfacer la consulta podría requerir muchas aplicaciones de registro de deshacer (miles).

Eso es lo que hace que las "consultas de larga duración" sean caras y mal vistas. Aumentarán el consumo de espacio en disco para mantener los registros de deshacer en el espacio de tabla del sistema, y ​​tendrán un rendimiento deficiente debido a que la aplicación de registros de deshacer revierte las versiones de las filas al leer.

Algunas bases de datos implementan una cantidad máxima de espacio de registro de deshacer que se puede consumir y, una vez que alcanzan ese límite, comienzan a descartar los registros de deshacer más antiguos e invalidan las transacciones en ejecución. Esto genera un mensaje de error de "instantánea demasiado antigua" para el usuario. InnoDB no tiene ese límite y permite la acumulación indefinidamente.