Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma diferença de desempenho entre BETWEEN e IN com MySQL ou no SQL em geral?


BETWEEN deveria superam IN neste caso (mas faça medir e verificar os planos de execução também!), especialmente como n cresce e como as estatísticas ainda são precisas. Vamos assumir:
  • m é o tamanho da sua tabela
  • n é o tamanho do seu intervalo

O índice pode ser usado (n é minúsculo comparado a m )


  • Em teoria, BETWEEN pode ser implementado com um único "range scan" (Oracle speak) no índice de chave primária e, em seguida, percorrer no máximo n nós folha de índice. A complexidade será O(n + log m)

  • IN geralmente é implementado como uma série (loop) de n "varreduras de intervalo" no índice de chave primária. Com m sendo o tamanho da tabela, a complexidade será sempre O(n * log m) ... o que é sempre pior (desprezível para tabelas muito pequenas m ou intervalos muito pequenos n )

O índice não pode ser usado (n é uma parte significativa de m )


De qualquer forma, você obterá uma verificação completa da tabela e avaliará o predicado em cada linha:

  • BETWEEN precisa avaliar dois predicados:um para o limite inferior e outro para o limite superior. A complexidade é O(m)

  • IN precisa avaliar no máximo n predicados. A complexidade é O(m * n) ... o que é sempre pior, ou talvez O(m) se o banco de dados pode otimizar o IN list para ser um mapa de hash, em vez de uma lista de predicados.