Pourquoi l'UNION des requêtes afin de ralentir dans MySQL?
Quand j'optimiser mes 2 requêtes à exécuter en moins de 0,02 secondes, puis de l'UNION eux la requête qui prend plus de 1 seconde pour exécuter. Aussi, une UNION TOUT prend plus de temps que d'une UNION DISTINCTES. Je suppose permettant doublons rendrait l'exécution de la requête plus rapide et pas plus lent. Suis-je vraiment juste mieux de l'exécution de l'2 requêtes séparément? Je préfère utiliser de l'UNION.
pourriez-vous poster le script?
Malheureusement je ne peux pas (de travail), il est assez simple requête même si je pense. Peut-être que j'ai besoin de quelques précisions sur la manière dont les SYNDICATS sont effectuées par MySQL. Je remarque sur une expliquer pour la rejoint requête, je suis en utilisant filesort et la table temporaire alors que chaque requête n'est pas.
Pas le script en entier, juste la requête concernée.
Comme un exemple simple, si je n'SELECT nom from t1 where champ1 = true il faut .001 et si je fais SELECT nom from t1 where champ1 = false il faut .1 secondes. Si je puis exécutez SELECT nom from t1 where champ1 = true UNION ALL SELECT nom from t1 where champ1 = false, elle prend plus de 1 seconde. Il n'est pas le résultat d'une requête spécifique.
Malheureusement je ne peux pas (de travail), il est assez simple requête même si je pense. Peut-être que j'ai besoin de quelques précisions sur la manière dont les SYNDICATS sont effectuées par MySQL. Je remarque sur une expliquer pour la rejoint requête, je suis en utilisant filesort et la table temporaire alors que chaque requête n'est pas.
Pas le script en entier, juste la requête concernée.
Comme un exemple simple, si je n'SELECT nom from t1 where champ1 = true il faut .001 et si je fais SELECT nom from t1 where champ1 = false il faut .1 secondes. Si je puis exécutez SELECT nom from t1 where champ1 = true UNION ALL SELECT nom from t1 where champ1 = false, elle prend plus de 1 seconde. Il n'est pas le résultat d'une requête spécifique.
OriginalL'auteur Greg | 2009-05-15
Vous devez vous connecter pour publier un commentaire.
Faire vos requêtes comprennent
ORDER BY … LIMIT
clauses?Si vous mettez un
ORDER BY … LIMIT
après unUNION
, il est appliqué à l'ensemble de laUNION
, et les index ne peut pas être utilisé dans ce cas.Si
id
est une clé primaire, cette requête sera immédiate:mais celui-ci ne sera pas:
Cela semble également être due à
ORDER BY
. Le tri d'un ensemble plus petit est plus rapide qu'une plus grande.Avez-vous besoin de l'ensemble résultant à trier?
Si non, il suffit de se débarrasser de la finale
ORDER BY
.order by
de l'enlever. en fait ma requête de 2,5 secondes, il peut aller jusqu'à 45secs.quel genre de réponse attendez-vous?
OriginalL'auteur Quassnoi
Une supposition:
Depuis une requête sur une table avec 2 syndicats, il pourrait être,que mysql a du mal à se décider sur une stratégie de verrouillage de la table, ou il essaie de certains de la mise en cache, qui ne fonctionne pas ici, puisque vous interroger pour ensembles disjoints, essaie de multithread l'accès (très raisonnable), mais fonctionne dans certains de verrouillage/simultanéité/fichier recherche de questions..
syndicats pourraient également emploient généralement une augmentation de la sécurité, puisque ces deux sélectionne doivent être cohérents. Si vous les mettez dans des transactions distinctes, ils ne le font pas.
Expérience:
Faire une copie de la table et ceux de l'union. Si je ne me trompe pas, il devrait être plus rapide.
Solution Possible:
Diviser le fichier en plusieurs fichiers, afin de permettre une meilleure simultanéité des stratégies. Ce ne serait pas/ne devrait pas aider avec des problèmes de verrouillage, mais les règles sur le multithreading/la recherche de problèmes dans la base de données.
Il serait utile de connaître les moteur de stockage que vous utilisez.
Bien juste mes 2 cents. Ne peut pas tester ce ici maintenant.
OriginalL'auteur AndreasT
Pourrait-il en être de mesurer les temps de réponse et pas le temps de récupérer toutes les données?
OriginalL'auteur erikkallen