Scrivi la query in questo modo:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Non specificare quali indici utilizzare.
A partire da WHERE
clausola, sembra che potrebbe essere utile:INDEX(status)
. Ma poiché "status" suona come un "flag" con cardinalità bassa, l'ottimizzatore potrebbe decidi di ignorare l'indice e di eseguire semplicemente una scansione della tabella. Va bene. Va bene perché è più veloce eseguire una scansione della tabella che rimbalzare tra un indice e i dati, quando l'indice non è molto selettivo. In ogni caso, lascia la decisione allo Strumento per ottimizzare.
Ora che ha a che fare con orders
, è necessario JOIN
a users
. L'unico modo per farlo è avere un indice su id
. Quel nome ("id") implica che potrebbe essere la PRIMARY KEY
, è? (Per favore fornisci SHOW CREATE TABLE
.)
L'altra domanda che hai menzionato dovrebbe essere scritta
SELECT * FROM users WHERE id=33
E, come già detto, l'indice (PRIMARY KEY
?) su id
è la cosa giusta.
Non vi è alcun vantaggio (per i dati SELECTs
, almeno) per INDEX(status, id_user)
. La tua selezione include tutte le colonne (*
); aveva recuperato solo id_user
, quindi un tale indice sarebbe "coprente" e avrebbe qualche vantaggio.