J'ai une requête importante avec de nombreuses instructions SELECT imbriquées. Une version simplifiée pourrait ressembler à ceci:Mise en cache des requêtes MySQL de la requête interne
SELECT * FROM tableA WHERE x IN(
SELECT * FROM tableB WHERE x IN(
SELECT * FROM tableC WHERE user_id = y
)
)
Fondamentalement, la déclaration la plus intérieure commence en regardant le user_id et la sélection d'une liste des numéros d'identification à utiliser dans le reste de la requête. Le problème que j'ai est que même si deux utilisateurs ont les mêmes données dans tableC, le reste de la requête ne semble pas être mis en cache.
Par exemple, si SELECT * FROM tableC WHERE user_id = 1
retours (1,2,3,4,5) et SELECT * FROM tableC WHERE user_id = 2
retourne aussi (1,2,3,4,5)
Si je lance la requête complète avec user_id = 1 le temps d'exécution est d'environ 0,007 seconde. Si je réexécute la requête, j'obtiens un temps d'exécution réduit de 0,002. Si je change le user_id à 2 et exécute la requête, le temps d'exécution remonte à 0.007 pour la première fois que la requête est exécutée. Est-il possible pour mySQL de mettre en cache le résultat des parties individuelles d'une requête?
Qu'en est-il de cette partie de la requête 'SELECT * FROM tableB WHERE x IN (..)'? Le résultat est le même pour quand user_id = 1 ou 2. Cependant, l'heure d'exécution de la requête suggère que le cache n'est pas utilisé – user1063998
Le cache de requêtes fonctionne de la manière suivante: 1. Obtenez votre requête et créez un hachage. 2. Vérifiez peut-être qu'il y a un résultat caché. 3. Si oui, le renvoie s'il ne l'enregistre pas dans le cache et le renvoie. Dans votre cas, vous donnerez deux hachages différents car les requêtes sont différentes et peu importe le résultat qu'elles renvoient –
Merci Andrej. Je suppose qu'une solution serait de diviser la plus grande requête en deux plus petites. De cette façon, je peux éviter de refaire le calcul coûteux si possible – user1063998