Écrivez la requête de cette façon :
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Ne spécifiez pas les index à utiliser.
En commençant par WHERE
clause, cela ressemble à ceci pourrait être utile :INDEX(status)
. Mais puisque "statut" sonne comme un "drapeau" avec une faible cardinalité, l'optimiseur peut décidez d'ignorer l'index et effectuez simplement une analyse de la table. Ça va. C'est OK car il est plus rapide de faire un parcours de table que de rebondir entre un index et les données, lorsque l'index n'est pas très sélectif. Dans tous les cas, laissez la décision à l'optimiseur.
Maintenant qu'il traite les orders
, il doit JOIN
aux users
. La seule façon de le faire est d'avoir un index sur id
. Ce nom ("id") implique qu'il pourrait s'agir de la PRIMARY KEY
, c'est ça ? (Veuillez fournir SHOW CREATE TABLE
.)
L'autre requête que vous avez mentionnée doit être écrite
SELECT * FROM users WHERE id=33
Et, comme déjà discuté, l'index (PRIMARY KEY
?) sur id
est la bonne chose.
Il n'y a aucun avantage (pour les SELECTs
donnés , au moins) pour INDEX(status, id_user)
. Votre sélection inclut toutes les colonnes (*
); il n'avait récupéré que id_user
, alors un tel index serait « couvrant » et présenterait certains avantages.