J'étais moi-même curieux à ce sujet. C'est très bien de lire de la documentation et des réponses théoriques, mais j'aime les équilibrer avec des preuves empiriques.
J'ai une table MySQL (InnoDB) qui contient 5 607 997 enregistrements. Cette table se trouve dans mon propre bac à sable privé, je sais donc que son contenu est statique et que personne d'autre n'utilise le serveur. Je pense que cela élimine efficacement tous les effets extérieurs sur les performances. J'ai une table avec un champ de clé primaire à incrémentation automatique (Id) dont je sais qu'il ne sera jamais nul et que j'utiliserai pour mon test de clause where (WHERE Id IS NOT NULL).
Le seul autre problème possible que je vois lors des tests est le cache. La première fois qu'une requête est exécutée sera toujours plus lente que les requêtes suivantes qui utilisent les mêmes index. C'est ce que j'appellerai ci-dessous l'appel à l'ensemencement du cache. Pour varier un peu, je l'ai exécutée avec une clause where dont je sais qu'elle sera toujours évaluée comme vraie, quelles que soient les données (TRUE = TRUE).
Cela dit, voici mes résultats :
Type de requête
| w/o WHERE | where id is not null | where true=true
COUNT()
| 9 min 30.13 sec ++ | 6 min 16.68 sec ++ | 2 min 21.80 sec ++
| 6 min 13.34 sec | 1 min 36.02 sec | 2 min 0.11 sec
| 6 min 10.06 se | 1 min 33.47 sec | 1 min 50.54 sec
COUNT(Id)
| 5 min 59.87 sec | 1 min 34.47 sec | 2 min 3.96 sec
| 5 min 44.95 sec | 1 min 13.09 sec | 2 min 6.48 sec
COUNT(1)
| 6 min 49.64 sec | 2 min 0.80 sec | 2 min 11.64 sec
| 6 min 31.64 sec | 1 min 41.19 sec | 1 min 43.51 sec
++Ceci est considéré comme l'appel du cache-sexe. On s'attend à ce qu'il soit plus lent que les autres.
Je dirais que les résultats parlent d'eux-mêmes. COUNT(Id) l'emporte généralement sur les autres. L'ajout d'une clause Where réduit considérablement le temps d'accès, même s'il s'agit d'une clause dont vous savez qu'elle sera évaluée comme vraie. Le point idéal semble être COUNT(Id)... WHERE Id IS NOT NULL.
J'aimerais bien voir les résultats d'autres personnes, peut-être avec des tableaux plus petits ou avec des clauses where sur des champs différents de celui que vous comptez. Je suis sûr qu'il existe d'autres variations que je n'ai pas prises en compte.