2010-05-07 20 views
7

He tenido éxito en el pasado al almacenar los resultados (pesadamente) procesados ​​de una consulta de base de datos en memcached, utilizando la última hora de actualización de las tablas subyacentes como parte de la clave de caché. Para las tablas MyISAM, la hora del último cambio está disponible en SHOW TABLE STATUS. Desafortunadamente, eso suele ser NULL para tablas InnoDB.¿Cómo puedo determinar cuándo se modificó por última vez una tabla InnoDB?

En MySQL 4.1, el ctime para un InnoDB en su línea SHOW TABLE STATUS solía ser su última actualización, pero eso no parece ser cierto para MySQL 5.1.

Hay un campo DATETIME en la tabla, pero solo se muestra cuando una fila ha sido modificada: ¡no puede mostrar el tiempo de eliminación de una fila que ya no existe! Entonces, realmente no puedo usar MAX(update_time).

Aquí está la parte realmente difícil. Tengo varias réplicas de las que leo. ¿Puedo averiguar el estado de la tabla que no depende de cuándo se han aplicado realmente los cambios?

Mi conclusión después de trabajar en esto por un tiempo es que no va a ser posible obtener esta información tan barata como me gustaría. Probablemente voy a guardar en caché los datos hasta el momento en que espero que la tabla cambie (se actualiza una vez al día), y permitir que el caché de consultas ayude donde pueda.

Respuesta

8

Esto es MySQL bug 14374, 15438, y subyacente InnoDB bug 2681.

Tengo dos sugerencias (aparte de parchear MySQL).

  1. Si está utilizando una tabla por archivo (innodb_file_per_table), establezca el archivo subyacente. Puede escribir una función/extensión MySQL para hacer esto. Esto puede retrasarse ligeramente, debido al almacenamiento en caché de la base de datos.
  2. Puede usar los activadores de actualización, eliminación e inserción para mantener su propia tabla de metadatos con los últimos tiempos de actualización para cada tabla que le preocupa.

Yo personalmente sugiero el segundo, ya que es mucho más portátil y no depende de los detalles de implementación (como innodb_file_per_table).

+2

tener en cuenta si va por la ruta 2.º sobre InnoDB desencadena: "Nota Actualmente, las acciones de clave externa en cascada no activan desencadenantes". (de [13.2.2.5. Restricciones de KEY FOREIGN] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) –

11

Si usted no está realmente interesado en la base de datos se ha cambiado, pero quiere saber tiempo o no una tabla de base de datos se ha cambiado usted debe buscar en MySQL CHECKSUM TABLE

Espero que esto ayude.

+0

¡Impresionante, exactamente lo que necesitaba! – astgtciv

-1

Yo sugeriría añadir otra columna a la mesa y dejar que MySQL no perder de vista cuando se modificó por última vez la mesa, algo como esto:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL 
+0

Esto solo se muestra cuando se actualizó una fila específica. Si bien podría hacer una tabla "SELECT MAX (last_update) FROM", esto podría agregar una gran cantidad de sobrecarga para una tabla con un gran número de filas solo para obtener el tiempo modificado más recientemente. –

Cuestiones relacionadas