2013-07-20 9 views
0

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?

Répondre

0

Il semble que vous utilisiez mysql. Ainsi, lorsque vous exécutez la requête 'SELECT * FROM tableC WHERE user_id = 1' la première fois, vous obtenez le résultat '1,2,3,4,5' et vous interrogez le cache de requêtes. Par conséquent, l'exécution de l'heure après la deuxième exécution est inférieure à la première. Dans ce cas, votre résultat est associé à votre première requête. Lorsque vous exécutez la deuxième requête, votre serveur n'en sait rien. Donc il l'exécute et renvoie quelque chose (dans votre cas les résultats sont identiques). La prochaine fois que vous exécuterez la deuxième requête, vous l'obtiendrez à partir du cache de requête et ce sera très rapide. Quoi qu'il en soit, le serveur va stocker deux enregistrements différents dans le cache de requête.

+0

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

+0

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 –

+0

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

Questions connexes