Utilisation du schéma de base de données pour le marquage de cette question est accepté Réponse est-il possible d'avoir une requête à l'aide de group_concat qui fonctionne avec une grande quantité de données? J'ai besoin d'obtenir des articles avec leurs balises pour tous les articles étiquetés avec tag x. L'utilisation d'une requête avec group_concat ayant ~ 5 millions d'étiquettes est très lente à> 15 secondes. Sans group_concat (éléments comme une question secondaire, comment résout ce problème? P>
4 Réponses :
Ceci est probablement un cas d'une stratégie d'indexation médiocre. Adapter le schéma montré dans La réponse acceptée de la question à laquelle vous avez lié: note que: p> Le type de données code> MySQL est un alias pour Définition des contraintes de clé étrangère dans
Bigint non signé non null auto_incrètent unique code> et, comme tel, est indexé; p> li>
items_Tags code> crée des index sur les colonnes de clé étrangère. P> LI>
ul> p>
Hmm Je suis assez sûr que j'ai les mêmes indices, vérifiera plus tard ce soir.
Je proposerais d'avoir un hybride entre Données normalisées et Dénormalisés Data. dans la colonne Créez un cron qui fonctionne périodiquement, ce qui construira cette table créer déclenche pour Choisissez quelle que soit la solution adaptée à vos besoins en considérant les avantages et les inconvénients. p> donc à la fin, vous aurez la table
Ainsi, à l'aide de la structure normalisée fournie par Eggyal em> je ferais la structure dénormalisée suivante: Tags code> Vous auriez toutes les balises (
tag_title code>) pour le
item_id correspondant code>.
Maintenant, vous avez 2 façons d'y parvenir: P>
items_tags_dénormalisé code> à l'aide de
Groupe_ConCat CODE> ou quelque chose qui vous convient (avantage: ne met pas de charge supplémentaire lorsque vous insérez. ou supprimer dans
items_tags code> Table; Inconvénient: La table dénormalisée ne sera pas toujours à jour (en fonction de la fréquence d'exécution de la courante) p> li>
Articles_Tags CODE> TABL SUR INSERTER ET SUPPRIMER Pour que vous continuez à mettre à jour le tableau
items_tags_dénormalisé code> Table (avantage: la table dénormalisée sera toujours à jour; inconvénient: charge supplémentaire lorsque vous insérez ou supprimez Dans
items_Tags code> table) p> li>
ul>
items_tags_dénormalisée de laquelle vous allez
Pourquoi ne pas ajouter le champ disormalisé (code> sur le champ code> éléments code> Table (ce qui est ainsi que ça)?
Il est crucial d'avoir des modèles distincts: une normalisée et une dénormalisation, votre solution est correcte mais de la conception POV, je suggérerais de le garder séparé pour diverses raisons: vous devez reconstruire la table, vous devez ajouter plus de colonnes, etc. Plus si vous Ajouter une colonne de balises dénormalisées dans les éléments Les performances de la table chuteront: taille plus grande = requêtes plus lentes
Pourquoi utiliseriez-vous GROUP_CONCAT pour cela? Pour une balise X donnée, vous avez dit que la sélection de la liste des éléments est rapide. Pour une liste donnée d'éléments, tous les tags devraient également être rapides. Et n'y a-t-il pas normalement une sorte de restriction, je veux dire des sites Web normaux ne montrent pas 100 000 entrées sur une page.
Je suggérerais: P>
drop temporary table if exists lookup_item; create temporary table lookup_item (item_id serial, primary key(item_id)); insert into lookup_item select i.id as item_id from items i where exists (select * from items_tags where item_id = i.id and tag_id = <tag_id>) and <other conditions or limits>; select * from lookup_item inner join items_tags it on it.item_id = i.id inner join tags t on t.id = it.tag_id order by i.<priority>, t.<priority>
Si je comprends correctement, Vous pouvez essayer d'exécuter group_concat code> n'est pas la seule chose que vous supprimez qui rend la requête plus rapide sans étiquettes. À l'intérieur du
group_concat code> Vous sélectionnez
tags.tag_title code> et forçant la table des étiquettes à accéder. P>
group_concat code> avec
items_tags.tag_id code> pour tester ma théorie. P>
Pouvez-vous donner des enregistrements d'exemples?
Il semble donc résoudre ce problème en limitant les questions à la plupart des 5 étiquettes. Et qu'est-ce qui vous fait penser qu'il utilise
group_concat () code> du tout lors de la gestion des balises?
@Barmar: la limite de balise sur SO N'EST PAS pour des raisons de performance, mais plutôt pour garder les questions ciblées ; Comme pour SYSTMA , les balises sont associées à des messages de la mode normalisée (la table
posttags code> ) et aussi une mode dénormalisée (le champ
Posts.Tags.Tags Code>) - Ce dernier permet de récupérer des balises d'un post avec le poste lui-même, tandis que le premier facilite la recherche de postes avec une balise particulière combinaisons.