Question

Je ne reçois aucune erreur en tant que telle, juste un problème de performances mineur.

EXPLAIN
SELECT
a.nid,
a.title,
a.uid,
b.parent,
b.weight,
c.name,
d.value
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1
INNER JOIN table3 AS c ON c.uid = a.uid
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average'

Quand je regarde quelles tables sont référencées, tout va bien, mais depuis la table 4 où il ne devrait sélectionner que la "valeur" sur le terrain, je reçois un ALL appelé ...

id  select_type     table   type      possible_keys                                   key     key_len   ref                   rows  Extra
1   SIMPLE          a     ref     PRIMARY,vid,status,uid,node_status_type,nid   status  4         const                 1    
1   SIMPLE          b     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.vid    1    
1   SIMPLE          c     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.uid    1   Using where
1   SIMPLE          d     ALL     NULL                                          NULL      NULL      NULL                  2     Using where

Comme vous pouvez le constater, il sélectionne * dans la table finale (d). Pourquoi fait-il cela alors que je n'ai besoin que d'un champ sélectionné? Quelqu'un peut-il m'aider?

Était-ce utile?

La solution

ALL désigne toutes les lignes, pas toutes les colonnes. Puisqu'il indique qu'il n'y a pas de clé possible, je suppose que vous n'avez pas d'index sur d.content_id ou d.value_type ou d.function.

Si vous voulez être chic, vous pouvez placer un index sur ces 3 colonnes.

Autres conseils

Les champs d.value_type et d.function sont-ils indexés? Ce serait l'instinct initial quant à la cause.

Ajoutez un index multi-colonne à table4 en fonction des colonnes type_contenu , type_vacite et fonction . <. / p>

Votre requête ne sélectionne pas toutes les colonnes de table4 , mais sélectionne toutes les lignes. ce n’est pas vraiment un problème s’il n’ya que deux personnes.

Notez qu'un plan d'exécution de requête MySQL peut ne pas donner la réponse attendue lorsque vous travaillez avec un petit nombre d'enregistrements; Il peut être plus rapide pour la base de données d’effectuer une analyse complète de la table dans ces circonstances.

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