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.