2010-06-04 3 views
2

Ma requête mysql ressemble à ceci:Requête de réécriture pour supprimer FIND_IN_SET?

SELECT pages.*, 
      showcase.*, 
      project.*  
     FROM pages 
INNER JOIN showcase ON showcase.pid = pages.uid AND showcase.deleted != 1 
INNER JOIN project ON FIND_IN_SET(project.uid, showcase.projects) 
    WHERE pages.deleted != 1 
     AND pages.pid = 14 
     AND pages.dokType = 150 

Le problème est le deuxième INNER JOIN - il utilise FIND_IN_SET parce une vitrine (= collection de projets) stocke ses projets en tant que séparés par des virgules liste dans le champ showcase.projects. FIND_IN_SET ne peut pas utiliser d'index autant que je sache, donc la deuxième jointure nécessite une analyse de table complète de la table de projet. Toute possibilité d'utiliser un index sans changer le schéma de base de données?

Répondre

0

Vous recherchez une 'chaîne' dans une autre chaîne.Vous devrez faire un scan malgré tout.L'autre manière optimisée pour ce faire en utilisant les index est d'utiliser un table de jointure Créer une nouvelle table showcase_projects qui a des colonnes de project_id et showcase_id.Cela aura alors un enregistrement pour chaque association entre les deux

Maintenant, cette réponse est basée sur ma compréhension primitive de votre infrastructure de données à partir de cette requête.

+0

En supposant que vous avez raison, je vais commencer à normaliser les données lundi. Sûrement la meilleure solution. – Max

+0

Bonne chance. Il suffit de ne pas dévalider la normalisation :) Il peut introduire des performances/traiter des problèmes de données dans le futur. –

0

Est-ce que showcase.projects est VARCHAR? Ensuite, vous pouvez utiliser REGEXP comme ceci:

... 
INNER JOIN project ON 
showcase.projects REGEXP CONCAT('[[:<:]]', project.uid, '[[:>:]]') 
WHERE ... 

Cette expression recherche des mots entiers (les constructions de support de marquer les limites de mots à gauche et à droite, respectivement Cependant, je ne suis pas sûr que ce sera en mesure d'utiliser. un index, peut-être quelqu'un peut trouver quelque chose de plus intelligent

Questions connexes