Escriba la consulta de esta manera:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
No especifique qué índices utilizar.
Comenzando con el WHERE cláusula, se parece a esto podría ser útil:INDEX(status) . Pero dado que "estado" suena como una "bandera" con baja cardinalidad, el optimizador puede decida ignorar el índice y simplemente haga un escaneo de la tabla. Esto está bien. Está bien porque es más rápido hacer un escaneo de tabla que rebotar entre un índice y los datos, cuando el índice no es muy selectivo. En cualquier caso, deje la decisión en manos del Optimizer.
Ahora que se trata de orders , necesita JOIN a users . La única forma de hacerlo es tener un índice en id . Ese nombre ("id") implica que podría ser la PRIMARY KEY , ¿Lo es? (Proporcione SHOW CREATE TABLE .)
La otra consulta que mencionaste debe ser escrita
SELECT * FROM users WHERE id=33
Y, como ya se ha comentado, el índice (PRIMARY KEY ?) en id es lo correcto.
No hay ninguna ventaja (para los SELECTs dados , al menos) para INDEX(status, id_user) . Su selección incluye todas las columnas (* ); solo había obtenido id_user , entonces dicho índice estaría "cubriendo" y tendría alguna ventaja.