De l'Union en tant que sous-requête MySQL
Je suis désireux d'optimiser une requête à l'aide d'un syndicat en tant que sous-requête. Je ne suis pas vraiment sûr de savoir comment construire la requête. Je suis de l'utilisation de MYSQL 5
Voici l'original de la requête:
SELECT Parts.id
FROM Parts_Category, Parts
LEFT JOIN Image ON Parts.image_id = Image.id
WHERE
(
(
Parts_Category.category_id = '508' OR
Parts_Category.main_category_id ='508'
) AND
Parts.id = Parts_Category.Parts_id
) AND
Parts.status = 'A'
GROUP BY
Parts.id
Ce que je veux faire est de remplacer cette ( (Parts_Category.category_id = '508' OR Parts_Category.main_category_id ='508' )
partie avec l'union ci-dessous. De cette façon, je peux laisser la clause GROUP BY et utiliser directement le col des indices qui devrait améliorer les performances. Des pièces et des pièces de la catégorie tables contient un demi-million de dossiers de chacun, donc un gain serait génial.
(
SELECT * FROM
(
(SELECT Parts_id FROM Parts_Category WHERE category_id = '508')
UNION
(SELECT Parts_id FROM Parts_Category WHERE main_category_id = '508')
)
as Parts_id
)
Quelqu'un peut-il me donner un indice sur la façon de le ré-écrire? J'ai essayé pendant des heures mais ne peut pas le faire comme je ne suis relativement nouveau pour MySQL.
OriginalL'auteur gus | 2009-07-21
Vous devez vous connecter pour publier un commentaire.
Noter que
MySQL
pouvez utiliserIndex Merge
et vous pouvez réécrire votre requête comme ceci:qui sera plus efficace si vous avez les indices suivants:
Je pense que dans ton deuxième exemple que j'aurais à ajouter un GROUPE PAR les Parties.id comme je ne veux pas l'doubles dont une partie peut être répertorié dans d'autres catégories. C'était l'idée derrière l'utilisation de l'Union. Je vais comparer la performance de toute façon. Merci Encore.
Le GROUPE EN a besoin dans le deuxième exemple et si ajouté-je obtenir le même problème filesort et à l'aide de temp de m'Expliquer.
un
UNION
a toujours besoin d'un filesort. Mais vous avez raison, j'ai besoin d'ajouter unDISTINCT
à la deuxième requête.Grâce Quassnoi, j'ai juste ajouté DISTINCTES sur parts_id à la place du GROUPE PAR sur les Pièces.id. comme vous l'avez dit - ce qui est intéressant, expliquer maintenant dit dans " extras à l'aide de Temp et de lignes nécessaires 519,330? Ce n'était pas le cas en utilisant un seul index sur chaque col dans le premier exemple. J'ai re-vérifié l'index et qu'ils sont corrects.
OriginalL'auteur Quassnoi