Bonjour à tous, que savez-vous de Count dans MySQL ?
Le besoin de données statistiques est très facile à rencontrer dans notre développement quotidien. MySQL prend également en charge une variété de fonctions de calcul,
Voyons. à faire ensuite Jetez un œil aux différences entre eux et s'ils présentent des pièges. [Apprentissage recommandé : Tutoriel vidéo MySQL]
La signification de count : count() est une fonction d'agrégation, pour le résultats renvoyés Ensemble, jugez ligne par ligne, si le paramètre de la fonction count n'est pas NULL, la valeur cumulée sera augmentée de 1, sinon elle ne sera pas ajoutée. Enfin, la valeur cumulée est renvoyée.
count (field) est spécial, cela signifie renvoyer le nombre total de lignes de données qui remplissent les conditions, et le paramètre "field" n'est pas NULL
Principe de différence de performances d'analyse
La couche serveur donnera ce qu'il veut Quoi ;
InnoDB ne donne que les valeurs nécessaires ;
L'optimiseur actuel optimise uniquement la sémantique de count(*) pour "obtenir le nombre de lignes", et les autres optimisations "évidentes" ne le sont pas done
Exemple :
count (identifiant de clé primaire), le moteur InnoDB parcourra toute la table, supprimera la valeur d'identifiant de chaque ligne et la renverra à la couche serveur. Une fois que la couche serveur a obtenu l'identifiant, elle juge qu'il ne peut pas être vide, elle l'accumule donc ligne par ligne. Pour
count(1), le moteur InnoDB parcourt toute la table mais ne récupère pas la valeur. La couche serveur met un chiffre « 1 » dans chaque ligne renvoyée. S'il est jugé qu'elle ne peut pas être vide, elle est accumulée par ligne.
count (field), si le serveur a besoin d'un champ, il renverra le champ. Si le champ est vide, les statistiques ne seront pas effectuées. Si la valeur du champ est trop grande, cela entraînera une inefficacité.
count(字段)<count(主键 id)<count(1)≈count(*)
Pourquoi compter(*) est le plus rapide ?
L'optimiseur fait son travail et trouve le plus petit nombre à parcourir.
InnoDB est une table organisée en index. Les nœuds feuilles de l'arborescence d'index de clé primaire sont des données, tandis que les nœuds feuilles de l'arborescence d'index ordinaire sont les valeurs de clé primaire. Par conséquent, l’arborescence d’index ordinaire est beaucoup plus petite que l’arborescence d’index de clé primaire. Pour des opérations telles que count(*), les résultats obtenus en parcourant n'importe quel arbre d'index sont logiquement les mêmes. Par conséquent, l'optimiseur MySQL trouvera le plus petit arbre à parcourir. Dans le but de garantir que la logique est correcte, la minimisation de la quantité de données analysées est l'une des règles générales de conception d'un système de base de données.
Quelques pièges à propos de NULL
// 数据中存在null值数据 select count(*) from audit_log a; 结果:1 select count(id) from audit_log a; 结果:0
Nous voyons que les résultats de count sont incohérents. Le nombre d'enregistrements doit être 1, mais count(id) est égal à 0
C'est parce que count(field) ne compte pas, le champ La valeur est nulle
Donc, lorsque le champ est un champ non vide, count(*) doit être utilisé pour résoudre ce problème.
MyISAM table bien que count(*) soit rapide, elle ne prend pas en charge les transactions ;
la commande show table status retourne rapidement, mais elle n'est pas précise ;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!