O MySQL não pode usar um índice composto em uma pesquisa na qual a WHERE
condição não inclui as colunas que formam um prefixo mais à esquerda:
O MySQL não pode usar o índice para realizar pesquisas se as colunas não formarem um prefixo mais à esquerda do índice.
Uma citação desta resposta no PostgreSQL chamou minha atenção:
Isso é um pouco diferente no Oracle 11, que às vezes também pode usar colunas que não estão no início da definição do índice.
Em que circunstâncias o Oracle (pelo menos no 11g) pode fazer uma pesquisa sem as colunas de prefixo mais à esquerda existentes na consulta?
No Oracle, temos um recurso chamado Index skip-scan que torna possível se beneficiar de índices compostos mesmo se a parte inicial (mais à esquerda) do índice não for especificada na condição WHERE. Este é um novo recurso do 9i , documentado aqui: http://download.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm
Em termos gerais, o CBO pode optar por:
Isso é chamado de 'pular varredura' na terminologia do Oracle. As varreduras de salto funcionam melhor quando o número de valores possíveis na etapa (1) é relativamente pequeno (ou seja, pequeno em comparação com o tamanho do índice)
A Oracle usará estatísticas para obter uma estimativa da cardinalidade da etapa (1) antes de avaliar se executar tantas varreduras de intervalo custará mais do que apenas digitalizar todo o índice sequencialmente