sql >> Base de Datos >  >> RDS >> Mysql

¿Hay alguna diferencia de rendimiento entre BETWEEN e IN con MySQL o en SQL en general?

BETWEEN debería superar a IN en este caso (pero hacer ¡medir y verificar los planes de ejecución también!), especialmente como n crece y como las estadísticas siguen siendo precisas. Supongamos:

  • m es el tamaño de tu mesa
  • n es el tamaño de su rango

Se puede usar el índice (n es pequeño en comparación con m )

  • En teoría, BETWEEN se puede implementar con un solo "escaneo de rango" (habla de Oracle) en el índice de clave principal, y luego atravesar como máximo n nodos de hoja de índice. La complejidad será O(n + log m)

  • IN generalmente se implementa como una serie (bucle) de n "escaneos de rango" en el índice de clave principal. Con m siendo el tamaño de la tabla, la complejidad siempre será O(n * log m) ... que siempre es peor (insignificante para tablas muy pequeñas m o rangos muy pequeños n )

No se puede usar el índice (n es una porción significativa de m )

En cualquier caso, obtendrá un escaneo completo de la tabla y evaluará el predicado en cada fila:

  • BETWEEN necesita evaluar dos predicados:uno para el límite inferior y otro para el límite superior. La complejidad es O(m)

  • IN necesita evaluar como máximo n predicados. La complejidad es O(m * n) ... que de nuevo siempre es peor, o quizás O(m) si la base de datos puede optimizar el IN lista para ser un hashmap, en lugar de una lista de predicados.