2016-12-20 3 views
0

J'ai une table FOLDERS, définissant smth comme structure de répertoire. Il contient les colonnes: ID, PARENT_ID et LINK_ID.Table de jointure MySQL avec elle-même avec la condition OU

Je ne peux pas changer l'application que j'ai un problème maintenant avec une requête lente.

Cette application a une logique que PARENT_ID pourrait se référer à la fois à l'ID ou LINK_ID.

Aussi, je ne peux pas changer la requête, que j'ai trouvé Ralentit l'ensemble de notre processus ETL:

SELECT folders.ID AS OrigFolderID, parentfolder.ID, parentfolder.Name 
FROM folders 
      LEFT JOIN folders AS parentfolder ON folders.ParentID=parentfolder.ID OR folders.ParentID=parentfolder.LinkID 
WHERE folders.ID IN    (112450385,188823933,211307470,211403833,211545367,212449523,212539966) 

Nous pouvons changer la base de données cependant, la suppression ou l'ajout d'index.

Y a-t-il une chance d'accélérer cette requête?

Il semble que les index sur "parentfolder" ne fonctionnent pas (il y a des index sur LinkID, sur ParentId et sur ID (qui est une clé primaire), et la table est entièrement scannée. .

+0

Mettez un expliquer avant la requête éditez votre question avec les résultats. Également afficher les définitions de table – Mihai

+1

Si vous ne pouvez pas changer la question, vous êtes à peu près à court d'options. Vous avez tous les index qui pourraient vous aider si vous pouviez retirer les OR de la requête. 'OR's pratiquement éliminer l'utilisation de l'index dans MySQL. – Uueerdo

Répondre

1

Je suppose ID et LinkID sont chacun indexées

OR est le tueur Vous devez trouver un moyen de changer la requête,.. pas de réglage, etc, peut résoudre le problème de la performance

. LEFT est suspect - Voulez-vous des valeurs NULL s'il n'y a pas de parent?

Le OR peut être transformé en UNION DISTINCT de deux sélections - une avec chaque côté du OR.

+0

Salut, Rick! Merci pour la réponse. Je ne peux pas changer la requête, donc il n'y a aucun moyen de résoudre le problème. Nous essaierons d'utiliser MS SQL Server pour cette application, ou nous essayerons de réduire la taille de la table. Merci! –