Desculpe pela pergunta boba, tentei consultar com a cláusula WHERE e ORDER no final, que na verdade demorou muito para implementar, mesmo pensando que a cláusula WHERE estava no campo indexado. Parece que o Mysql primeiro executa ORDER na tabela inteira e depois SELECT, o que não é o comportamento preferido. Estou certo? Como posso fazer com que primeiro execute SELECT e depois ORDER.
Obrigado!
Termo aditivo:
mysql> explain SELECT *
FROM `products`
WHERE (`products`.user_id = 1111)
AND ( (`products`.`type` = 'type1' ) )
ORDER BY products.id DESC
LIMIT 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: products
type: ref
possible_keys: index_products_on_user_id, index_products_on_type
, index_products_on_type_and_status
key: index_products_on_user_id
key_len: 5
ref: const
rows: 2570
Extra: Using where; Using filesort
Há um capítulo na documentação do MySQL sobre otimização ORDER BY
Não consigo encontrar uma referência do MySQL, mas para comparação, aqui estão as fases de processamento de consulta lógica do SQL Server . SELECT deve ser feito antes de ORDER BY.
Sem código, suponho que você tenha índices inadequados para a consulta que está executando
Editar, após o código adicionado
Você provavelmente precisa de um índice
user_id, type, product_id DESC
para cobrir os predicados WHERE e ORDER BY: você não tem nenhum índice adequado atualmente, então umafilesort
operação é gerada.Além disso, você tem SELECT * que requer pesquisas e processamento extras para obter todas as colunas, independentemente do índice usado (a menos que a tabela tenha apenas 3 colunas)
O link gbn fornecido é um ótimo lugar para começar. Tradicionalmente, não é uma prática recomendada usar ORDER BY em qualquer coisa que será automatizada (processos armazenados, exibições, etc.) no banco de dados - é provável que não seja onde os dados serão consumidos pelo usuário final. O melhor local para solicitar dados é na mídia de saída final usada pelo consumidor.
Por exemplo, se você estiver usando o MSFT Reporting Services, coloque uma classificação em seu relatório em vez de na consulta. Quando o relatório for executado, a classificação ocorrerá no ciclo de renderização da geração do relatório, que ocorre após os dados já terem sido coletados.
Sugiro que sua consulta não seja seletiva o suficiente, portanto, mesmo que haja um índice no campo,
WHERE
ele não é usado ... Se você postar a consulta e o plano de execução, provavelmente obterá um conselho melhor.