La documentation
officielle de MySQL 5.1 reconnaît qu'InnoDB ne donne pas de statistiques précises avec SHOW TABLE STATUS
. Alors que les tables MYISAM conservent spécifiquement un cache interne de métadonnées telles que le nombre de lignes, etc., le moteur InnoDB stocke à la fois les données de table et les index dans */var/lib/mysql/ibdata**
InnoDB n'a pas de fichier d'index rapide permettant une requête rapide des numéros de ligne.
Les numéros de ligne de tableau incohérents sont signalés par SHOW TABLE STATUS
car InnoDB estime dynamiquement la valeur 'Rows' en échantillonnant une plage de données de la table (dans */var/lib/mysql/ibdata**) puis extrapole le nombre approximatif de lignes. À tel point que la documentation InnoDB reconnaît l'inexactitude du numéro de ligne jusqu'à 50 % lors de l'utilisation de SHOW TABLE STATUS
La documentation MySQL suggère d'utiliser le cache de requête MySQL pour obtenir des requêtes de numéro de ligne cohérentes, mais la documentation ne spécifie pas comment . Une explication succincte de la façon dont cela peut être fait suit.
Tout d'abord, vérifiez que la mise en cache des requêtes est activée :
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Si la valeur de have_query_cache est NON puis activez le cache de requête en ajoutant les lignes suivantes à /etc/my.cnf puis redémarrez mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(pour plus d'informations, voir http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Interroger le contenu du cache avec
mysql> SHOW STATUS LIKE 'Qcache%';
Utilisez maintenant le SQL_CALC_FOUND_ROWS
instruction dans un SELECT
requête :
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
tentera une lecture à partir du cache et, si cette requête n'est pas trouvée, exécutera la requête sur la table spécifiée, puis validera le nombre de lignes de la table dans le cache de la requête. Exécutions supplémentaires de la requête ci-dessus (ou autre SELECT
'cachable' instructions - voir ci-dessous) consultera le cache et renverra le résultat correct.
'cachable' SELECT
requêtes
- même s'ils LIMIT
le résultat - consultera le cache de la requête et vous permettra d'obtenir (une seule fois) le nombre total de lignes du tableau avec
SELECT FOUND_ROWS();
qui renvoie le total correct des lignes de table de la requête précédente en cache.