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.