Optimización de conteo de optimización de MySQL

Optimizar la consulta de recuento

select count(*) from employees where id > 40000;

optimizarlo a la siguiente declaración

select (select count(*) from employees) - count(*) from employees where id <= 40000;

realizar pruebas

inserte la descripción de la imagen aquí
Dado que hay 90551 datos con id> 40000 y 20557 datos con id <40000, ¿se puede optimizar si se realiza una operación de resta?

motor innodb

Diseñar la tabla de empleados como motor InnoDB y comprobar su tiempo de ejecución.
Las dos declaraciones anteriores (15, 16) son la ejecución del motor InnoDB.
inserte la descripción de la imagen aquí
Se puede encontrar que después de modificar la declaración original, el tiempo de ejecución cambia de 0.038 s a 0.050 s, que es más lento. Esto no está optimizado para ¿ah?
Utilice la declaración de explicación para ver el plan de ejecución y descubra que la declaración original escaneó 55493 filas de datos, el tipo es rango y se utiliza el índice id_index. Las filas de la declaración modificada SUBQUERY muestran que se han escaneado 110,986 filas de datos en toda la tabla, y las filas de PRIMARY han escaneado 19,623 filas de datos, lo que significa que el recuento (*) en el lado izquierdo del signo menos también escanea toda la tabla, lo cual es imposible en absoluto optimización.

Oración original:

inserte la descripción de la imagen aquí

Declaración modificada:

inserte la descripción de la imagen aquí

motor MyISAM

Después de modificar la tabla de empleados al motor MyISAM, verifique el tiempo de ejecución. Las
dos declaraciones anteriores (17, 18) son la ejecución del motor MyISAM.
inserte la descripción de la imagen aquí
Se puede encontrar que después de modificar la declaración original, el tiempo de ejecución cambia de 0.034 s a 0,004 s, que es mucho más rápido.
para ver el plan de ejecución

Oración original:

De forma predeterminada, el motor MyISAM guarda un resultado de conteo (*), pero si hay una condición donde, la operación de MyISAM es un escaneo completo de la tabla.
inserte la descripción de la imagen aquí

Declaración modificada:

inserte la descripción de la imagen aquí
Se puede encontrar que las filas escaneadas son en realidad 1. Esto se debe a que MyISAM almacena una copia de count (*) de forma predeterminada, por lo que si count () se optimiza de esta manera en el motor MyISAM, la velocidad de consulta se puede mejorar enormemente. .

Supongo que te gusta

Origin blog.csdn.net/weixin_45930241/article/details/125269733
Recomendado
Clasificación