Question

J'ai des instructions SQL similaires aux suivantes, qui joignent quatre tables, puis ordonnent les résultats en fonction du "statut". colonne de la première:

SELECT * 
 FROM a, b, c, d 
 WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
 ORDER BY a.status

Cela fonctionne. Cependant, c'est lent. J'ai travaillé à cause de la clause ORDER BY et de l'absence d'index sur la table "a".

Les quatre tables ont les clés primaires définies sur le "id". colonne.

Je sais donc que je dois ajouter un index à la table a, qui inclut le "statut". colonne mais quoi d'autre doit-il inclure? Doit " enchérir " ;, " cid " et " a " être là aussi?

J'ai essayé de poser cette question dans un sens SQL général, mais si cela est important, la cible est SQLite à utiliser avec Gears.

Merci d'avance,

Jake (noob)

Était-ce utile?

La solution

Je dirais que c'est lent car le moteur effectue des balayages partout au lieu de chercher. Voulez-vous dire que vous sélectionnez SELECT. * À la place? Ce serait plus rapide aussi, SELECT * ici équivaut à a. *, B. *, C. *, D. *.

Vous obtiendrez probablement de meilleurs résultats si vous mettez un index distinct sur chacune de ces colonnes:

  • a.did (de sorte que a.did = 'XXX' est une recherche au lieu d'un scan, aide également a.did = d.id)
  • a.cid (pour a.cid = c.id)
  • b.aid (pour a.id = b.aid)

Vous pouvez essayer d'ajouter Status aux premier et deuxième index avec l'ordre ASCENDING pour des performances supplémentaires - cela ne fait pas de mal.

Autres conseils

Je serais curieux de savoir comment vous avez résolu le problème: "la clause ORDER BY et l'absence d'index sur la table" a ". Je trouve cela un peu suspect car il existe un index sur la table a, sur la clé primaire, dites-vous plus tard.

En regardant la nature de la requête et ce que je peux deviner à propos de la nature des données, je pense que cette requête produira généralement relativement peu de résultats par rapport à la taille des tables qu’elle utilise, et que, par conséquent, ORDER BY serait extrêmement bon marché. Bien sûr, ce n’est qu’une supposition.

La capacité d’un index d’aider dépend des données de la table. Les indices que votre optimiseur de requête utilisera lors de l'exécution d'une requête dépendent de nombreux facteurs différents, l'un des plus importants étant le nombre attendu de résultats produits à partir d'une recherche.

Une chose qui aiderait beaucoup est de publier le résultat de EXPLAINing your query.

avez-vous essayé les jointures?

sélectionnez * dans une jointure interne b sur a.id = b.aid jointure interne c sur a.cid = c.id jointure interne d sur a.did = d.id où a.did = 'XXX' ORDER BY a.status

l'utilisation correcte des jointures (gauche, richt, interne, externe) dépend de la structure des tables

espérons que cela aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top