Mi aplicación requiere mucha base de datos. Actualmente, estoy ejecutando MySQL 5.5.19 y usando MyISAM, pero estoy en el proceso de migrar a InnoDB. El único problema que queda es el rendimiento de la suma de comprobación.
Mi aplicación realiza entre 500 CHECKSUM TABLE
y 1000 declaraciones por segundo en horas pico, porque la GUI del cliente está sondeando constantemente los cambios en la base de datos (es un sistema de monitoreo, por lo que debe ser muy sensible y rápido).
Con MyISAM, hay sumas de comprobación en vivo que se calculan previamente en la modificación de la tabla y son MUY rápidas. Sin embargo, no existe tal cosa en InnoDB. Entonces, CHECKSUM TABLE
es MUY lento.
Esperaba poder verificar la última hora de actualización de la tabla. Desafortunadamente, esto tampoco está disponible en InnoDB. Ahora estoy atascado, porque las pruebas han demostrado que el rendimiento de la aplicación cae drásticamente.
Simplemente hay demasiadas líneas de código que actualizan las tablas, por lo que no es posible implementar la lógica en la aplicación para registrar los cambios de la tabla.
¿Existe algún método rápido para detectar cambios en las tablas de InnoDB?
fuente
Creo que he encontrado la solución. Durante algún tiempo estuve buscando en el Servidor Percona para reemplazar mis servidores MySQL, y ahora creo que hay una buena razón para esto.
El servidor Percona presenta muchas nuevas tablas INFORMATION_SCHEMA como INNODB_TABLE_STATS, que no está disponible en el servidor MySQL estándar. Cuando tu lo hagas:
Obtiene el recuento real de filas y un contador. La documentación oficial dice lo siguiente sobre este campo:
Por lo tanto, este contador se ajusta de vez en cuando, pero puede hacer una suma de verificación del número de filas y el contador, y luego con cada modificación de la tabla obtendrá una suma de verificación única. P.ej:
De todos modos, iba a actualizar mis servidores al servidor Percona, por lo que este límite no es un problema para mí. Administrar cientos de desencadenantes y agregar campos a las tablas es un gran problema para esta aplicación, porque es muy tarde en el desarrollo.
Esta es la función PHP que he creado para asegurarme de que las tablas se puedan sumar en cualquier motor y servidor que se use:
Puedes usarlo así:
Espero que esto ahorre algunos problemas a otras personas que tienen el mismo problema.
fuente
Debe actualizar a Mysql v5.6 + en esa versión innodb también tiene soporte para la tabla de suma de comprobación. http://dev.mysql.com/doc/refman/5.6/en/checksum-table.html
aparte de eso, la solución ideal sería si su cliente no estuviera sondeando los resultados constantemente, sino que usted estuviera empujando datos nuevos y modificados cuando y si estuvieran disponibles. Sería más rápido y habría menos carga en el servidor. si está utilizando una interfaz gráfica de usuario basada en la web, debe buscar APE http://ape-project.org/ u otros proyectos similares.
fuente
Si está agregando principalmente a una tabla, puede conectar AUTO_INCREMENT como una medida de actualización.
Pero preferiría referirme a una fuente externa como un contador en Memcached que incrementará cada vez que cambie algo en la base de datos.
fuente
Puede intentar hacer lo siguiente:
Esto devuelve un número que aumenta con cada actualización de la tabla, y realizar un seguimiento permitirá detectar cambios.
Nota importante: el valor se cambia inmediatamente después de una ACTUALIZACIÓN, no después de COMPROMISO. Por lo tanto, es posible que no vea los cambios si las modificaciones se realizaron dentro de otra transacción que no finalizó.
fuente
Esta respuesta no tiene nada que ver con las versiones o tipos de bases de datos mysql, quería saber si las declaraciones de actualización estaban haciendo cambios Y hacer esto en mi código php ...
Creé una tabla ficticia con un registro y un campo que consultaría para obtener el valor de current_timestamp de mysql.
A la tabla de datos que se está actualizando, se agregó un campo de marca de tiempo y se usó la opción mysql "ON UPDATE CURRENT_TIMESTAMP"
Comparado # 1 y # 2
Esto no funcionará el 100% del tiempo, pero para mi aplicación fue una solución simple y excelente. Espero que esto ayude a alguien
fuente