Maison > base de données > tutoriel mysql > Résumé des différences d'utilisation de la fonction MySQL Count

Résumé des différences d'utilisation de la fonction MySQL Count

藏色散人
Libérer: 2022-11-29 21:02:05
avant
2007 Les gens l'ont consulté

Avant-propos

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 différence entre count(*), count(1), count(id)

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é.

Tri efficace

count(字段)<count(主键 id)<count(1)≈count(*)
Copier après la connexion

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
Copier après la connexion

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.

count(*) summary

  • 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 ;

  • Le nombre direct de table InnoDB (*) parcourra toute la table Bien que le résultat soit précis, cela entraînera des problèmes de performances.

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal