Mon application est très gourmande en bases de données. Actuellement, j'utilise MySQL 5.5.19 et j'utilise MyISAM, mais je suis en train de migrer vers InnoDB. Le seul problème qui reste est la performance de la somme de contrôle.
Mon application fait environ 500 à 1 000 CHECKSUM TABLE
instructions par seconde aux heures de pointe, car l'interface graphique du client interroge constamment la base de données pour les changements (c'est un système de surveillance, donc doit être très réactif et rapide).
Avec MyISAM, il existe des sommes de contrôle en direct qui sont précalculées lors de la modification de la table et sont TRÈS rapides. Cependant, il n'y a rien de tel dans InnoDB. Donc, CHECKSUM TABLE
c'est TRÈS lent.
J'espérais pouvoir vérifier la dernière heure de mise à jour du tableau, malheureusement, ce n'est pas disponible dans InnoDB non plus. Je suis bloqué maintenant, car les tests ont montré que les performances de l'application chutent considérablement.
Il y a tout simplement trop de lignes de code qui mettent à jour les tables, donc l'implémentation de la logique dans l'application pour enregistrer les modifications de table est hors de question.
Existe-t-il une méthode rapide pour détecter les changements dans les tables InnoDB?
la source
Je pense avoir trouvé la solution. Pendant un certain temps, je cherchais à Percona Server pour remplacer mes serveurs MySQL, et maintenant je pense qu'il y a une bonne raison à cela.
Le serveur Percona introduit de nombreuses nouvelles tables INFORMATION_SCHEMA comme INNODB_TABLE_STATS, qui n'est pas disponible dans le serveur MySQL standard. Quand vous faites:
Vous obtenez le nombre de lignes réel et un compteur. La documentation officielle dit ce qui suit sur ce domaine:
Ce compteur encapsule donc de temps en temps, mais vous pouvez faire une somme de contrôle du nombre de lignes et du compteur, puis à chaque modification de la table, vous obtenez une somme de contrôle unique. Par exemple:
J'allais quand même mettre à niveau mes serveurs vers le serveur Percona, donc cette limite n'est pas un problème pour moi. La gestion de centaines de déclencheurs et l'ajout de champs aux tables est une difficulté majeure pour cette application, car elle est très tardive dans le développement.
Voici la fonction PHP que j'ai trouvée pour m'assurer que les tables peuvent être vérifiées quel que soit le moteur et le serveur utilisés:
Vous pouvez l'utiliser comme ceci:
J'espère que cela évite des ennuis à d'autres personnes ayant le même problème.
la source
Vous devez mettre à jour vers Mysql v5.6 + dans cette version innodb prend également en charge la table de total de contrôle. http://dev.mysql.com/doc/refman/5.6/en/checksum-table.html
à part cela, la solution idéale serait si votre client n'interrogeait pas constamment les résultats, mais plutôt que vous poussiez les données nouvelles et modifiées quand et si elles étaient disponibles. Ce serait plus rapide et moins de charge serait sur le serveur. si vous utilisez une interface graphique basée sur le Web, vous devriez consulter APE http://ape-project.org/ ou d'autres projets similaires.
la source
Si vous ajoutez principalement à une table, vous pouvez accrocher AUTO_INCREMENT comme mesure de la mise à jour.
Mais je préfère faire référence à une source externe comme un compteur dans Memcached que vous incrémenterez chaque fois que vous modifiez quelque chose dans la base de données.
la source
Vous pouvez essayer de faire ce qui suit:
Cela renvoie un nombre qui augmente avec chaque mise à jour de la table, en garder la trace permettra de détecter les changements.
Remarque importante: la valeur est modifiée immédiatement après une MISE À JOUR, pas après COMMIT. Il est donc possible que vous ne voyiez pas les modifications si les modifications ont été apportées dans une autre transaction qui n'a pas abouti.
la source
Cette réponse n'a rien à voir avec les versions ou types de base de données mysql, je voulais savoir si les instructions de mise à jour apportaient des modifications ET le faire dans mon code php ..
Création d'une table factice avec un enregistrement et un champ que je voudrais interroger pour obtenir la valeur de current_timestamp de mysql.
À la table de données en cours de mise à jour, ajouté un champ d'horodatage et utilisé l'option mysql "ON UPDATE CURRENT_TIMESTAMP"
Comparé # 1 et # 2
Cela ne fonctionnera pas à 100% du temps mais pour mon application, c'était une solution simple et excellente. J'espère que cela aide quelqu'un
la source