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.