Encontramos el resultado a este inconveniente, o por lo menos eso pensamos. Si presentas inquietudes dínoslo, para nosotros será un placer responderte
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()
yMAX()
en elSELECT
parte. - El argumento para
MIN()
yMAX()
es una referencia de columna simple que forma parte de un key. - No hay
WHERE
cláusula o laWHERE
se usa con una constante para todos prefix partes del key antes del argumento deMIN()
/MAX()
. - Si el argumento se usa en el
WHERE
cláusula, se puede comparar con una constante con<
o<=
en caso deMAX()
y con>
o>=
en caso deMIN()
.
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óna 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 sonMIN()
yMAX()
funciones y todas ellas usando la misma columna que es la siguiente parte del índice después de la usadaGROUP 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
- MIN ()
- MAX ()
- Manual de MySQL sobre escaneos de índices sueltos
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.
Te mostramos las reseñas y valoraciones de los usuarios
Tienes la opción de sostener nuestro estudio fijando un comentario o puntuándolo te lo agradecemos.