>

Optimización mínima / máxima sin GRUPO POR

MariaDB y MySQL pueden optimizar las funciones MIN () y MAX () para que sean una búsqueda de una sola fila en los siguientes casos:

  • Solo se utiliza una tabla en el SELECT.
  • Solo tienes constantes, MIN() y MAX() en el SELECT parte.
  • El argumento para MIN() y MAX() es una referencia de columna simple que forma parte de un key.
  • No hay WHERE cláusula o la WHERE se usa con una constante para todos prefix partes del key antes del argumento de MIN()/MAX().
  • Si el argumento se usa en el WHERE cláusula, se puede comparar con una constante con < o <= en caso de MAX() y con > o >= en caso de MIN().

A continuación se muestran algunos ejemplos para aclarar esto. En este caso asumimos que hay un índice en las columnas. (a,b,c)

SELECTMIN(a),MAX(a)from t1
SELECTMIN(b)FROM t1 WHERE a=const
SELECTMIN(b),MAX(b)FROM t1 WHERE a=const
SELECTMAX(c)FROM t1 WHERE a=const AND b=const
SELECTMAX(b)FROM t1 WHERE a=const AND b<const
SELECTMIN(b)FROM t1 WHERE a=const AND b>const
SELECTMIN(b)FROM t1 WHERE a=const AND b BETWEEN const AND const
SELECTMAX(b)FROM t1 WHERE a=const AND b BETWEEN const AND const
  • En lugar de a=const la condición a IS NULL puede ser usado.

La optimización anterior también funciona para subconsultas:

SELECT x from t2 where y=(SELECTMIN(b)FROM t1 WHERE a=const)

Las combinaciones cruzadas, donde no existe una condición de combinación para una tabla, también se pueden optimizar para algunas key búsquedas:

selectmin(t1.key_part_1),max(t2.key_part_1)from t1, t2

Optimización mínima / máxima con GROUP BY

MariaDB y MySQL admiten escaneo de índice suelto, lo que puede acelerar ciertos GROUP BY consultas. La idea básica es que al escanear un BTREE index (el tipo de índice más común para los motores de almacenamiento MariaDB) podemos saltar sobre valores idénticos para cualquier prefix de un key y así acelerar significativamente el escaneo.

La exploración suelta es posible en los siguientes casos:

  • La consulta usa solo una tabla.
  • los GROUP BY part solo usa columnas indexadas en el mismo orden que en el índice.
  • Las únicas funciones agregadas en el SELECT parte son MIN() y MAX() funciones y todas ellas usando la misma columna que es la siguiente parte del índice después de la usada GROUP BY columnas.
  • No se pueden usar columnas indexadas parciales (como solo indexar 10 caracteres de un VARCHAR(20) columna).

Se aplicará un escaneo suelto a su consulta si EXPLAIN muestra Using index for group-by en el Extra columna. En este caso, el optimizador solo realizará una búsqueda de fila adicional para calcular el valor de MIN() o MAX() para cada único key prefix.

Los siguientes ejemplos asumen que la tabla t1 tiene un índice en (a,b,c).

SELECT a, b,MIN(c),MAX(c)FROM t1 GROUPBY a,b

Ver también

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.