J'interface une base de données MySQL avec PHP Data Objects (PDO) et exécute une requête SQL étendue. Normalement, cela prend environ 1500 ms; J'ai encore besoin de l'optimiser. Lorsque j'exécute le script PHP deux fois avec un court intervalle entre les deux, la requête ne prend que 90 ms environ. La requête est dans les deux cas la même. Lorsque j'exécute le script, avec la même requête, après un certain temps, cela prend à nouveau 1500 ms.
Pourquoi donc? La base de données se cache-t-elle automatiquement? Y a-t-il un certain temps que la base de données enregistre le cache puis le supprime automatiquement?
Je suppose que les résultats ne peuvent pas être mis en cache par PHP, car cela se produit dans deux threads différents. Je ne pense pas que PHP mettrait en cache les résultats, car il ne peut pas savoir si la base de données a changé.
J'ai un script qui s'exécute toutes les minutes pour insérer de nouvelles lignes dans la base de données. Cela peut également être la raison pour laquelle il faut à nouveau 1500 ms après un certain temps; le cache aurait été supprimé, car les tables pertinentes ne sont plus les mêmes.
Réponses:
Il s'agit probablement d'un artefact du cache de requêtes MySQL .
Vous exécutez la requête SQL, MySQL met en cache son résultat et la prochaine exécution si rapide. Lorsque vous exécutez le script pour insérer les données dans les tables référencées par votre requête, le cache de résultats est invalidé et la requête doit être exécutée "pour de vrai" la prochaine fois.
De la documentation MySQL liée ci-dessus:
la source
Oui, mySQL (en commun avec tous les autres produits de base de données populaires) met en cache les requêtes qui lui sont adressées.
La mise en cache est assez intelligente - elle peut souvent utiliser un cache pour une requête même si les paramètres exacts de la requête ne sont pas les mêmes. Cela peut faire une grande différence dans les performances.
La mise en cache est entièrement contrôlée à l'intérieur du logiciel serveur DB; vous n'avez aucune visibilité de ce que contient le cache, ni de la durée pendant laquelle un élément donné reste dans le cache; il peut être écrasé à tout moment en fonction de ce que les autres requêtes sont appelées, etc. Il est là pour améliorer les performances, mais il ne doit pas être utilisé pour les performances.
Vous pouvez en savoir plus à ce sujet ici dans le manuel MySQL .
En outre, l'utilisation de PDO vous permet d'écrire vos requêtes en tant que «instructions préparées», en liant les paramètres plutôt qu'en les codant en dur dans une chaîne de requête en texte brut. Cela a également une implication de mise en cache sur le serveur de base de données et pour les requêtes répétées, améliorera également les performances.
la source
SELECT *
etselect *
signifie qu'une requête par ailleurs identique ne sera pas servie à partir du cache. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Lien 5.1 publié pour la cohérence, mais s'applique à toutes les versions.