Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi le nombre de lignes estimé est-il très différent dans les résultats de phpmyadmin ?

Contrairement aux tables MyISAM, les tables InnoDB ne gardent pas trace du nombre de lignes que la table contient.

Pour cette raison, la seule façon de connaître le nombre exact de lignes dans une table InnoDB est d'inspecter chaque ligne de la table et d'accumuler un décompte. Par conséquent, sur de grandes tables InnoDB, effectuer un SELECT COUNT(*) FROM innodb_table requête peut être très lente car elle effectue une analyse complète de la table pour obtenir le nombre de lignes.

phpMyAdmin utilise une requête comme SHOW TABLE STATUS pour obtenir une estimation du nombre de lignes dans la table à partir du moteur (InnoDB). Puisqu'il ne s'agit que d'une estimation, elle varie à chaque fois que vous l'appelez, parfois les variations peuvent être assez importantes, et parfois elles sont proches.

Voici un article de blog informatif sur COUNT(*) pour Tables InnoDB par Percona.

La page de manuel de MySQL pour AFFICHER L'ÉTAT DE LA TABLE indique :

Le nombre de lignes. Certains moteurs de stockage, tels que MyISAM, stockent le nombre exact. Pour d'autres moteurs de stockage, tels qu'InnoDB, cette valeur est une approximation et peut différer de la valeur réelle jusqu'à 40 à 50 %. Dans de tels cas, utilisez SELECT COUNT(*) pour obtenir un décompte précis.

La page sur les les restrictions InnoDB va plus en détail :

SHOW TABLE STATUS ne donne pas de statistiques précises sur les tables InnoDB, à l'exception de la taille physique réservée par la table. Le nombre de lignes n'est qu'une estimation approximative utilisée dans l'optimisation SQL.

InnoDB ne conserve pas de décompte interne de lignes dans une table, car les transactions simultanées peuvent "voir" différents nombres de lignes en même temps. Pour traiter un SELECT COUNT(*) FROM t InnoDB analyse l'index de la table, ce qui prend un certain temps si l'index n'est pas entièrement dans le pool de mémoire tampon. Si votre table ne change pas souvent, utiliser le cache de requête MySQL est une bonne solution. Pour obtenir un décompte rapide, vous devez utiliser une table de compteur que vous créez vous-même et laisser votre application la mettre à jour en fonction des insertions et des suppressions qu'elle effectue. Si un nombre approximatif de lignes est suffisant, SHOW TABLE STATUS peut être utilisé. Voir Section 14.3.14.1, « ​​Performances InnoDB Conseils de réglage" .