2012-08-24 3 views
0

J'ai 5 tables dans ma base de données.
[Articles] - id, nom, etc ...
[Catégories] - id, nom
[tags] - id, nom
Comment extraire les deux catégories AND tags d'une base de données MySQL pour un article?

2 tables Joining
[Items_Categories] - ITEM_ID, category_id
[Items_Tags] - iTEM_ID, tag_id

J'ai besoin tout simplement de connaître la meilleure requête performante (en utilisant REJOINT si nécessaire) pour tirer 1 ou plusieurs articles de la DB avec toutes ses informations, y compris les catégories et les étiquettes, étant donné l'item_id = $ id.

So Far, je donne les résultats suivants qui fonctionne, mais sur 25 - 50 requêtes, il était lent:

SELECT `items`.`name`, `items`.`etc`, 
group_concat(DISTINCT categories.name ORDER BY categories.name DESC SEPARATOR ", ") AS category, 
group_concat(DISTINCT tags.name ORDER BY tags.name DESC SEPARATOR ", ") AS tag, 
`items`.`id` AS id 
FROM (`items` AS items, `item_categories` AS categories, `items_to_categories` AS items_cats, `item_tags` AS tags, `items_to_tags` AS items_tags) 
JOIN `item_categories` ON `categories`.`id` = `items_cats`.`category_id` AND items_cats.item_id = $id 
JOIN `item_tags` ON `tags`.`id` = `items_tags`.`tag_id` AND items_tags.item_id = $id WHERE `items`.`id` = $id 
+0

GROUP_CONCAT d'abord, puis rejoindre. Utilisez des sous-requêtes. –

+0

Il n'y a rien de simple à trouver la requête la plus performante. Préfixez votre requête avec Explain et lancez-la, et mettez le résultat dans votre question, tout ce que nous pouvons faire est de deviner pour le moment. –

+1

Les sous-requêtes sont presque toujours un drapeau rouge à mes yeux d'écriture de requête. En outre, je pense qu'il existe des techniques «simples» pour obtenir une base très performante. La partie vraiment difficile est dans l'ultra-ajustement de la performance; mais je n'ai pas remarqué un réel besoin de cela (avec des requêtes bien conçues) jusqu'à ce qu'il y ait des millions de lignes. 9 fois sur 10, comprendre simplement comment le plan de requête sera construit en fonction de votre SQL vous permettra d'écrire des requêtes de plusieurs ordres de grandeur plus efficaces (si votre schéma est bon). –

Répondre

2

Le problème est que vous faites en fait un plein (Quelqu'un at-il quelque chose de mieux?) joindre en premier (en listant les tables comme vous l'avez fait) au lieu de rejoindre sélectivement "dans l'ordre" et permettre aux jointures d'être rationalisées par le plan de requête. Essayez de vous joindre comme cela pour joindre explicitement les lignes appropriées. Ceci donnera une requête rapide et rapide, et il sera facilement rendu encore plus rapide en ajoutant les index appropriés. Ma philosophie, cependant, est que vous devriez d'abord avoir une requête rapide, puis l'obtenir rapidement avec l'indexation; ne pas utiliser les index comme première approche.

+0

Merci, cela a fonctionné comme un charme, et est une amélioration notable. – dnyce

Questions connexes