¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador! ?

¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador! ?

Incluido en los temas
#
15 Interpretación del Manual de desarrollo de Ali
△ Hollis, una persona con una búsqueda única de la codificación △
¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador!  ?
Este es el intercambio original número 232 de Hollis

Autor l
Fuente de Hollis l La
consulta de la base de datos de Hollis (ID: hollischuang) se cree que es familiar para muchas personas. Todos los programadores que a menudo son ridiculizados son especialistas en CRUD. El llamado CRUD se refiere a la adición, eliminación y modificación de la base de datos.

Además de las operaciones de adición, eliminación, modificación y consulta de bases de datos, las operaciones de consulta se utilizan con mayor frecuencia. En todas las operaciones de consulta, a menudo se utilizan operaciones de cantidad estadística.

En cuanto a la cantidad de filas en la base de datos, ya sea MySQL u Oracle, hay una función que se puede utilizar, que es COUNT

Sin embargo, es esta función de COUNT de uso común la que esconde muchos misterios, especialmente durante la entrevista, será abusado si no tiene cuidado. Si no lo cree, intente responder las siguientes preguntas:

1、COUNT有几种用法?
2、COUNT(字段名)和COUNT(*)的查询结果有什么不同?
3、COUNT(1)和COUNT(*)之间有什么不同?
4、COUNT(1)和COUNT(*)之间的效率哪个更高?
5、为什么《阿里巴巴Java开发手册》建议使用COUNT(*)
6、MySQL的MyISAM引擎对COUNT(*)做了哪些优化?
7、MySQL的InnoDB引擎对COUNT(*)做了哪些优化?
8、上面提到的MySQL对COUNT(*)做的优化,有一个关键的前提是什么?
9、SELECT COUNT(*) 的时候,加不加where条件有差别吗?
10、COUNT(*)、COUNT(1)和COUNT(字段名)的执行过程是怎样的?

Si puede responder todas las 10 preguntas anteriores con precisión, significa que realmente conoce la función COUNT. Si hay algún punto de conocimiento que no comprende, este artículo puede ayudarlo a responder sus preguntas.

1. Conoce COUNT

La función COUNT se describe en detalle en el sitio web oficial de MySQL:
¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador!  ?

Simplemente traduzca:

1. COUNT (expr), devuelve el número de filas recuperadas por la instrucción SELECT de que el valor de expr no es NULL. El resultado es un valor GRANDE.

2. Si el resultado de la consulta no alcanza ningún registro, devuelve 0

3. Sin embargo, vale la pena señalar que los resultados estadísticos de COUNT (*) contendrán el número de filas con un valor de NULL.

Es decir, la siguiente tabla registra

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

Los resultados de la consulta que utilizan la declaración count (*), count (id), count (id2) son los siguientes:

select count(*),count(id),count(id2)
from #bla
results 7 3 2

Además de COUNT (id) y COUNT ( ), también puede usar COUNT (constante) (como COUNT (1)) para contar el número de filas. ¿Cuál es la diferencia entre estas tres declaraciones SQL? ¿Cuál es más eficiente? ¿Por qué es obligatorio en el "Manual de desarrollo de Alibaba Java" no utilizar COUNT (nombre de columna) o COUNT (constante) en lugar de COUNT ( )?
¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador!  ?

La diferencia entre COUNT (nombre de columna), COUNT (constante) y COUNT (*)

Anteriormente mencionamos que COUNT (expr) se usa para contar el número de filas, y el contador es el número de filas donde expr no es NULL. Luego, en las tres sintaxis de COUNT (nombre de columna), COUNT (constante) y COUNT ( ), expr respectivamente Son nombres de columna, constantes y .

Luego, los nombres de las columnas, las constantes y estas tres condiciones, la constante es un valor fijo, ciertamente no NULL. Puede entenderse como una consulta de la fila completa, por lo que no debe ser NULL, por lo que el resultado de la consulta solo del nombre de la columna puede ser NULL.

Por lo tanto, COUNT (constante) y COUNT (*) indican el número de filas en una tabla de base de datos que cumple con los criterios. El COUNT (nombre de la columna) indica el número de filas donde el valor de la columna que cumple con la consulta no es NULL.

Además de la diferencia en el conjunto de resultados obtenido por la consulta, COUNT ( ) se compara con COUNT (constante) y COUNT (nombre de columna). COUNT ( ) es la sintaxis para las filas de conteo estándar definidas por SQL92. Debido a que es una sintaxis estándar, MySQL La base de datos ha realizado muchas optimizaciones para él.

SQL92,是数据库的一个ANSI/ISO标准。它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。

Optimización de COUNT (*)

Como se mencionó anteriormente, COUNT (*) es la sintaxis estándar para contar el número de filas definidas por SQL92, por lo que la base de datos MySQL ha realizado muchas optimizaciones para él. Entonces, ¿qué has hecho exactamente?

La introducción aquí distinguirá entre diferentes motores de ejecución. Los motores de ejecución más utilizados en MySQL son InnoDB y MyISAM.

Hay muchas diferencias entre MyISAM e InnoDB. Una de las diferencias clave está relacionada con el COUNT (*) que presentaremos a continuación, es decir, MyISAM no admite transacciones. Los bloqueos en MyISAM son bloqueos a nivel de tabla; InnoDB admite transacciones y admite filas. Bloqueo de nivel.

Debido a que los bloqueos MyISAM son bloqueos a nivel de tabla, las operaciones en la misma tabla deben realizarse en serie. Por lo tanto, MyISAM ha hecho una optimización simple, es decir, puede registrar el número total de filas de la tabla por separado, si usa COUNT de una tabla (*) Al realizar una consulta, puede devolver directamente el valor registrado, por supuesto, siempre que no exista condición where.

La razón por la que MyISAM puede registrar el número total de filas en la tabla para la consulta COUNT (*) es que la base de datos MyISAM es un bloqueo a nivel de tabla y no habrá modificación simultánea del número de fila de la base de datos, por lo que la cantidad de filas obtenidas por la consulta es precisa.

Sin embargo, para InnoDB, este tipo de operación de caché no se puede realizar, porque InnoDB admite transacciones, la mayoría de las cuales son bloqueos a nivel de fila, por lo que el número de filas en la tabla puede modificarse al mismo tiempo, por lo que el número total de filas registradas en el caché No es exacto.

Sin embargo, InnoDB todavía está optimizado para la declaración COUNT (*).

En InnoDB, cuando se usa COUNT (*) para consultar el número de filas, es inevitable escanear la tabla, entonces puede trabajar duro para optimizar la eficiencia en el proceso de escaneo de la tabla.

A partir de MySQL 8.0.13, para la declaración SELECT COUNT (*) FROM tbl_name de InnoDB, se han realizado algunas optimizaciones en el proceso de escaneo de tablas. La premisa es que la declaración de consulta no contiene condiciones como WHERE o GROUP BY.

Sabemos que el propósito de COUNT (*) es solo contar el número total de filas. Por lo tanto, a él no le importa el valor específico que encontró. Por lo tanto, si puede seleccionar un índice de costo más bajo durante el proceso de escaneo de la tabla, Eso puede ahorrar mucho tiempo.

Sabemos que los índices en InnoDB se dividen en índices agrupados (índices de clave principal) e índices no agrupados (índices de clave no principal). Los nodos hoja del índice agrupado almacenan la fila completa de registros, en lugar de los nodos hoja del índice agrupado. Es el valor de la clave principal registrada en la fila.

Por lo tanto, por el contrario, el índice no agrupado es mucho más pequeño que el índice agrupado, por lo que MySQL dará prioridad al índice no agrupado más pequeño para escanear la tabla. Por lo tanto, cuando construimos una tabla, además del índice de clave principal, es necesario crear un índice de clave no principal.

Hasta ahora, hemos introducido la optimización de COUNT (*) en la base de datos MySQL La premisa de estas optimizaciones es que la declaración de consulta no contiene las condiciones WHERE y GROUP BY.

COUNT (*) 和 COUNT (1)

Después de presentar COUNT (*), echemos un vistazo a COUNT (1). Hay diferentes opiniones sobre si existe alguna diferencia entre los dos.

Algunos dicen que COUNT (*) se convertirá en COUNT (1) cuando se ejecute, por lo que COUNT (1) tiene menos pasos de conversión, por lo que es más rápido.

También se dice que debido a que MySQL ha realizado optimizaciones especiales para COUNT ( ), COUNT ( ) es más rápido.

Entonces, ¿qué afirmación es la correcta? Eche un vistazo a lo que dice la documentación oficial de MySQL:


InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

El enfoque de la pintura: del mismo modo, sin diferencia de rendimiento. Por lo tanto, para COUNT (1) y COUNT (*), la optimización de MySQL es exactamente la misma, ¡no hay nadie que sea más rápido que nadie!

Dado que COUNT (*) es lo mismo que COUNT (1), ¿cuál se recomienda?

¡Se recomienda utilizar COUNT (*)! Debido a que esta es la gramática estándar para contar el número de filas definidas por SQL92, y este artículo solo se basa en el análisis de MySQL, existen diferentes opiniones sobre este tema en Oracle.

COUNT (campo)

Finalmente, es el COUNT (campo) que no hemos mencionado. Su consulta es relativamente simple y grosera. Es realizar un escaneo completo de la tabla, y luego determinar si el valor del campo especificado es NULL, y se acumula si no es NULL.

En comparación con COUNT ( ), COUNT (campo) tiene un paso más para determinar si el campo de consulta es NULL, por lo que su rendimiento es más lento que COUNT ( ).

para resumir

Este artículo presenta el uso de la función COUNT, que se utiliza principalmente para contar el número de filas de la tabla. Los usos principales son COUNT (*), COUNT (campo) y COUNT (1).

Debido a que COUNT ( ) es la sintaxis estándar para contar el número de filas definidas por SQL92, MySQL ha realizado muchas optimizaciones. MyISAM registrará directamente el número total de filas de la tabla para la consulta COUNT ( ), mientras que InnoDB escaneará la tabla. Es hora de elegir el índice más pequeño para reducir los costos. Por supuesto, la premisa de estas optimizaciones es que no existe una consulta condicional de dónde y grupo.

En InnoDB, no hay diferencia en la implementación de COUNT (*) y COUNT (1), y la eficiencia es la misma, pero COUNT (campo) requiere un juicio no NULL del campo, por lo que la eficiencia será menor.

Debido a que COUNT ( ) es una gramática estándar para contar el número de filas definidas por SQL92, y es eficiente, use COUNT ( ) directamente para consultar el número de filas en la tabla.

Materiales de referencia:
https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_count
"Geek Time-45 Lectures on MySQL Actual Combat"
¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador!  ?

Invitamos a todos a prestar atención a la cuenta pública de Java Way y a publicar artículos técnicos originales de Java con regularidad ~

  • MÁS | Artículos más interesantes

  • Mi novia no se fue a casa en medio de la noche durante mucho tiempo, y el resultado después de tocar su teléfono móvil me rompió
  • El CEO de ByteDance, Zhang Yiming, criticó a RR.HH., "¡De acuerdo con este requisito, no puedo entrar yo solo!"
  • La cultura de la ingeniería de software de Google: inspira la creatividad y fomenta la autonomía
  • Estadísticas nacionales de sueldos de programadores en septiembre de 2019, ¿dónde estás?

Si te gusta este artículo, mantén presionado el
código QR y sigue a Hollis.
¡La declaración de MySQL COUNT puede ser tan miserable para el entrevistador!  ?
Reenvíalo al círculo de amigos. Este es mi mayor apoyo.
Buen articulo, estoy leyendo ❤️

Supongo que te gusta

Origin blog.51cto.com/13626762/2544316
Recomendado
Clasificación