Escreva a consulta desta forma:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Não especifique quais índices usar.
Começando com o
WHERE
cláusula, parece que isso pode ser útil:INDEX(status)
. Mas como "status" soa como uma "bandeira" com baixa cardinalidade, o otimizador pode decidir ignorar o índice e simplesmente fazer uma varredura na tabela. Tudo bem. Tudo bem porque é mais rápido fazer uma varredura de tabela do que saltar entre um índice e os dados, quando o índice não é muito seletivo. Em qualquer caso, deixe a decisão para o Optimizer. Agora que está lidando com
orders
, ele precisa JOIN
para users
. A única maneira de fazer isso é ter um índice em id
. Esse nome ("id") implica que pode ser a PRIMARY KEY
, é isso? (Por favor, forneça SHOW CREATE TABLE
.) Indexar livro de receitas
A outra consulta que você mencionou deve ser escrita
SELECT * FROM users WHERE id=33
E, como já discutido, o índice (
PRIMARY KEY
?) em id
é a coisa certa. Não há vantagem (para os
SELECTs
fornecidos , pelo menos) para INDEX(status, id_user)
. Sua seleção inclui todas as colunas (*
); ele buscou apenas id_user
, então tal índice estaria "cobrindo" e teria alguma vantagem.