Quel est le problème avec ma requête MySQL?
-
03-07-2019 - |
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?
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 à Votre requête ne sélectionne pas toutes les colonnes de 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. table4
en fonction des colonnes type_contenu
, type_vacite
et fonction
. <. / p>
table4
, mais sélectionne toutes les lignes. ce n’est pas vraiment un problème s’il n’ya que deux personnes.