Je veux un moyen rapide de compter le nombre de lignes de ma table qui compte plusieurs millions de lignes. J'ai trouvé le post " MySQL: le moyen le plus rapide de compter le nombre de lignes " sur Stack Overflow, qui semblait résoudre mon problème. Bayuah a fourni cette réponse:
SELECT
table_rows "Rows Count"
FROM
information_schema.tables
WHERE
table_name="Table_Name"
AND
table_schema="Database_Name";
Ce que j'ai aimé car cela ressemble à une recherche au lieu d'une analyse, donc ça devrait être rapide, mais j'ai décidé de le tester
SELECT COUNT(*) FROM table
pour voir combien il y avait une différence de performance.
Malheureusement, je reçois des réponses différentes comme indiqué ci-dessous:
Question
Pourquoi les réponses diffèrent-elles d'environ 2 millions de lignes? Je suppose que la requête qui effectue une analyse complète de la table est le numéro le plus précis, mais existe-t-il un moyen d'obtenir le numéro correct sans avoir à exécuter cette requête lente?
J'ai couru ANALYZE TABLE data_302
, ce qui s'est terminé en 0,05 seconde. Lorsque j'ai exécuté à nouveau la requête, j'obtiens maintenant un résultat beaucoup plus proche de 34384599 lignes, mais ce n'est toujours pas le même nombre select count(*)
qu'avec 34906061 lignes. Est-ce que l'analyse de la table revient immédiatement et se déroule en arrière-plan? Je pense qu'il vaut la peine de mentionner qu'il s'agit d'une base de données de test et n'est pas en cours d'écriture.
Personne ne s'en souciera s'il s'agit simplement de dire à quelqu'un la taille d'une table, mais je voulais passer le nombre de lignes à un peu de code qui utiliserait ce chiffre pour créer des requêtes asynchrones de «taille égale» pour interroger la base de données en parallèle, similaire à la méthode indiquée dans Augmentation des performances de requête lente avec l'exécution de requête parallèle par Alexander Rubin. En l'état, j'obtiendrai simplement l'identifiant le plus élevé avec SELECT id from table_name order by id DESC limit 1
et j'espère que mes tables ne seront pas trop fragmentées.
NUM_ROWS
colonne