Mysql
 sql >> Base de données >  >> RDS >> Mysql

Y a-t-il une différence de performances entre BETWEEN et IN avec MySQL ou SQL en général ?

BETWEEN devrait surpasser IN dans ce cas (mais faites mesurer et vérifier aussi les plans d'exécution !), d'autant plus que n grandit et que les statistiques sont toujours exactes. Supposons :

  • m est la taille de votre table
  • n est la taille de votre plage

L'index peut être utilisé (n est minuscule par rapport à m )

  • En théorie, BETWEEN peut être implémenté avec un seul "balayage de plage" (parole d'Oracle) sur l'index de clé primaire, puis traverse au plus n indexer les nœuds feuilles. La complexité sera O(n + log m)

  • IN est généralement implémenté comme une série (boucle) de n "range scans" sur l'index de clé primaire. Avec m étant la taille de la table, la complexité sera toujours O(n * log m) ... ce qui est toujours pire (négligeable pour les très petites tables m ou de très petites plages n )

L'index ne peut pas être utilisé (n est une partie importante de m )

Dans tous les cas, vous obtiendrez une analyse complète de la table et évaluerez le prédicat sur chaque ligne :

  • BETWEEN doit évaluer deux prédicats :un pour la borne inférieure et un pour la borne supérieure. La complexité est O(m)

  • IN doit évaluer au plus n prédicats. La complexité est O(m * n) ... ce qui est toujours pire, ou peut-être O(m) si la base de données peut optimiser le IN liste pour être un hashmap, plutôt qu'une liste de prédicats.