Siempre he pensado que contar (1) es más efectivo que contar (*), que es despreciado por mis compañeros.

¿MySQL count (1) es realmente más rápido que count (*)? 

¿Siempre piensas como yo que contar (1) es realmente más rápido que contar (*)? De repente, un día estaba hablando de esto con mis colegas y me despreciaron seriamente.

Entonces, ¿lo has estudiado tú mismo? Si les digo que son iguales, ¿lo creerían?

El recuento con la condición Where contará todas las filas de acuerdo con el resultado del escaneo. Su rendimiento depende más de su condición Where, por lo que solo explicamos la situación sin Where.

El motor MyISAM registrará el número total de filas en una tabla, por count(*) lo que devolverá directamente el número durante la ejecución  , lo cual es muy eficiente. Después de MySQL 5.5, el motor predeterminado se cambia a InnoDB. Debido al aumento del control de versiones (MVCC), cuando múltiples transacciones acceden a los datos y las operaciones de actualización, cada transacción debe mantener su propia visibilidad, luego cada transacción El número de filas recuperadas también es diferente, por lo que el número específico de filas no se puede almacenar en caché y necesita count todas las filas cada vez  . ¿Bien  count(1) y  count(*)diferente?

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference. Esta es la explicación del sitio web oficial. Haga clic para 阅读原文ver el texto oficial directamente . Entonces, las dos implementaciones son realmente iguales. Entonces, ¿por qué son iguales?

Para explorar este problema, primero necesitamos entender  count el significado, la siguiente es la definición dada por el sitio web oficial

Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.

La explicación aproximada es devolver el recuento de los valores no NULL de expr en las filas recuperadas por la instrucción SELECT. En este punto, entendemos que es una función agregada, y luego se cuenta el conjunto de resultados de SELECT, pero el parámetro no es NULL. Luego continuamos leyendo el contenido del sitio web oficial:

COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.

El contenido general es que count (*) es diferente. No le importa si el valor de retorno está vacío o no. Calculará su conteo, porque 1 en count (1) es una expresión constante, por lo que count (*) sigue siendo count (1) ) Consiste en contar todos los conjuntos de resultados, por lo que son esencialmente iguales.

Por supuesto, InnoDB mismo ha realizado algunas optimizaciones en este lugar, y utilizará el índice secundario más pequeño para la  count optimización de consultas. Si no hay un índice secundario, se elegirá el índice agrupado. Este diseño ahorra muchos gastos generales desde la perspectiva de IO solamente.

En este punto, entendemos que el recuento (*) y el recuento (1) son esencialmente lo mismo. Entonces, ¿qué es recuento (columna)?

count (column) también atravesará toda la tabla, pero la diferencia es que obtendrá el valor de la columna para determinar si está vacía, y luego se acumulará, luego, si el contenido debe analizarse para la clave principal, si es secundaria, debe basarse en la clave principal nuevamente Obtener contenido es otra operación de IO, por lo que el rendimiento del recuento (columna) definitivamente no es tan bueno como los dos anteriores. Si lo comparas en términos de eficiencia:count(*)=count(1)>count(primary key)>count(column)

Dado que el recuento (*) depende de todos los conjuntos de datos en la consulta, ¿debemos evitar el recuento completo tanto como sea posible en el diseño? Por lo general, realizaremos el almacenamiento en caché adecuado para las consultas de conteo predecible. Puede ser Redis o una tabla de conteo de MySQL separada. Por supuesto, debemos considerar los problemas de coherencia de cualquier manera.

El artículo está aquí, ¿tiene una nueva comprensión de count ()?


往期推荐

¡Recomiende las 33 mejores configuraciones de IDEA, fáciles de usar y de volar!


Escribe así, ¡debe ser un código de pollo picante!


¡Muchas formas de eliminar caracteres de espacio en blanco de String! ? ¡La diferencia es tan grande!

Este artículo es proporcionado por el soporte técnico de "Yiban Editor"

 

Enfrentando el problema 329 de Java: ¿Qué comando puede monitorear diversa información de estado operativo de la máquina virtual?

Simultaneidad en profundidad Problema 013: Ampliación de la optimización de bloqueo sincronizado

Si te gusta este artículo,

Mantenga presionado el código QR para seguir a Hollis. 

Reenviar al círculo de amigos es mi mayor apoyo.

Click  para ver 

Como es un sentimiento

Mirar es una especie de apoyo

↘↘↘

Supongo que te gusta

Origin blog.csdn.net/hollis_chuang/article/details/108570817
Recomendado
Clasificación