2010-03-01 6 views
2

Requête 1:Mysql Optimisation des requêtes

SELECT cid, 
     dl 
FROM chal 
WHERE cid IN (
     SELECT cid 
     FROM c_users 
     WHERE uid = 636587 
     ); 

Requête 2:

SELECT chal.cid AS cid, 
     chal.dl AS dl 
FROM chal, 
     c_users 
WHERE uid = 808 
     AND chal.cid = c_users.cid; 

cid est la clé primaire dans Chal cid et uid sont indexés dans c_users, cid est pas unique;

Lequel de la requête ci-dessus est le meilleur?

Expliquer dit le texte suivant

  • Requête 1 utilise deux types d'indice à savoir ALL et index_subquery

  • Requête 2 utilisateurs deux types d'indice à savoir ALL et ref

I Je me demande pourquoi les deux requêtes disent TOUT comme type d'index bien que cid soit la clé primaire dans la table chal.

Répondre

0

Ces requêtes ne sont pas identiques.

S'il y a des 2 égaux cid s pour un utilisateur donné à c_users, la première requête renverra 1 enregistrement par cid, tandis que le second retourne deux enregistrements.

index_subquery est l'optimisation MySQL qui pousse l'expression testée avec IN dans la sous-requête IN et retourne TRUE sur le premier match.

La première requête utilisera toujours chal comme une table de premier plan, tandis que le second peut choisir betwee chal et c_users et plus probablement choisir c_users.

Vous devez créer un index composite sur c_users (uid, cid).

1

Est-ce que cid est indexé dans c_users? Si ce n'est pas le cas, vous avez la garantie d'un scan de table complet (alias "ALL") ici.

+0

cid est indexé dans c_users et chal –

1

Je suppose que vous demandez quelle requête sera la plus rapide, alors en règle générale, la deuxième requête sera plus rapide. Mais la différence sera insignifiante pour les tables avec un petit nombre de lignes.

1

Je n'utiliserais pas de jointures ou de sélection imbriquée.

Je voudrais écrire deux sql au niveau de l'application, ce qui sera beaucoup plus rapide que vous faites l'échelle.

et votre sélection doit être basée sur la clé primaire sur les deux tableaux. cid