SELECT count (table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'YOUR_DB' donnera le nombre de tables dans votre base de données
shasi kanth
Réponses:
416
SELECT SUM(TABLE_ROWS)FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA ='{your_db}';
Remarque dans la documentation: pour les tables InnoDB, le nombre de lignes n'est qu'une estimation approximative utilisée dans l'optimisation SQL. Vous devrez utiliser COUNT (*) pour les nombres exacts (ce qui est plus cher).
ou, si vous le souhaitez pour chaque table: SELECT nom_table, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{your_db}';
TheSoftwareJedi
5
Existe-t-il un autre moyen d'obtenir table_row et table_name? Parce que je veux un résultat exact et non une estimation approximative. Je vous remercie.
krunal shah
3
@krunalshah, C'est l'une des restrictions d'InnoDB. Voir dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html , section Restrictions sur les tables InnoDB, pour plus d'informations. Vous pouvez toujours utiliser un SELECT COUNT (*) FROM t, qui est cependant beaucoup plus lent
Marquage le
2
Jaitsu, non ce n'est pas. count (*) (ou plus réaliste count (id)) est ce que mysql utilise pour compter ses lignes n'est-ce pas? Dans tous les cas, je viens de le tester et j'ai obtenu un plus grand nombre pour l'appel count (), quoi que cela vaille.
codygman
2
SELECT TABLE_NAME, SUM (TABLE_ROWS) N FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{your_db}' group by TABLE_NAME;
PiyusG
175
Vous pouvez probablement mettre quelque chose ensemble avec la table Tables . Je ne l'ai jamais fait, mais il semble qu'il y ait une colonne pour TABLE_ROWS et une pour TABLE NAME .
Pour obtenir des lignes par table, vous pouvez utiliser une requête comme celle-ci:
SELECT table_name, table_rows
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA ='**YOUR SCHEMA**';
Existe-t-il un autre moyen d'obtenir table_row et table_name? Parce que je veux un résultat exact et non une estimation approximative. Je vous remercie.
krunal shah
1
comme l'a mentionné kuranl, cela ne renvoie qu'une estimation et renverra probablement des résultats différents lorsqu'il sera exécuté plusieurs fois
Kris
Les tables contenant au moins ~ 250 enregistrements semblent signaler un nombre différent de lignes chaque fois que j'exécute cette requête.
Arthur
Oups ... j'aurais aimé voir le mot "estimé" avant la main ... comme hier! La réponse ne devrait-elle pas être rejetée? Comme OP n'a pas demandé "d'estimation" et il semble idiot de penser qu'il peut souhaiter une estimation. "estimation" Pourrait éviter aux marrons comme moi de ne pas avoir "l'estimation"?
Kreeverp
111
Comme @Venkatramanan et d'autres, j'ai trouvé INFORMATION_SCHEMA.TABLES peu fiable (en utilisant InnoDB, MySQL 5.1.44), donnant des nombres de lignes différents chaque fois que je l'exécute, même sur des tables au repos. Voici un moyen relativement hacky (mais flexible / adaptable) de générer une grosse instruction SQL que vous pouvez coller dans une nouvelle requête, sans installer de gemmes Ruby ni d'autres choses.
SELECT CONCAT('SELECT "',
table_name,'" AS table_name, COUNT(*) AS exact_row_count FROM `',
table_schema,'`.`',
table_name,'` UNION ')FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema ='**my_schema**';
Il produit une sortie comme celle-ci:
SELECT"func"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.func UNIONSELECT"general_log"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.general_log UNIONSELECT"help_category"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.help_category UNIONSELECT"help_keyword"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.help_keyword UNIONSELECT"help_relation"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.help_relation UNIONSELECT"help_topic"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.help_topic UNIONSELECT"host"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.host UNIONSELECT"ndb_binlog_index"AS table_name, COUNT(*)AS exact_row_count FROM my_schema.ndb_binlog_index UNION
Copiez et collez à l'exception de la dernière UNION pour obtenir une sortie agréable comme,
Merci, j'espérais que je n'aurais pas besoin d'installer de plugins / gemmes pour obtenir les décomptes exacts.
bradvido
Prend trop de temps à exécuter en cas de grand nombre de tables dans la base de données.
ollamh
1
ajouter "select * from (" au début et ") comme ordre de sortie par exact_row_count desc" à la fin de la requête générée après avoir supprimé la dernière UNION pour obtenir l'ordre par nombre de tables desc
Raghavendra
Pour exclure des vues: WHERE table_schema = ' my_schema ' et TABLE_TYPE LIKE '% TABLE%'
Watson
39
Je viens de courir:
show table status;
Cela vous donnera le nombre de lignes pour CHAQUE table plus un tas d'autres informations. J'avais l'habitude d'utiliser la réponse sélectionnée ci-dessus, mais c'est beaucoup plus facile.
Je ne sais pas si cela fonctionne avec toutes les versions, mais j'utilise 5.5 avec le moteur InnoDB.
Malheureusement, si vous utilisez InnoDB, cette approche souffre des mêmes inexactitudes que les autres méthodes décrites ci-dessus. Par exemple, j'ai une table InnoDB qui a environ 65 000 lignes, mais ces méthodes indiquent ici qu'elle en a de 350 000 à plus de 780 000.
PeterToTheThird
Pour une base de données avec quelques lignes, c'est assez précis (ou assez précis pour mes besoins). Il m'a donné 1086 lignes pour une table que COUNT (*) a rapporté 904 lignes.
Magne
De loin la meilleure réponse. J'utilise InnoDB mais je n'ai besoin que d'une commande rapide pour connaître l'ordre de grandeur.
Nemo
Sérieusement, j'aimerais que cela soit accepté. Ne pas utiliser InnoDB et me donne une réponse exacte.
Kolob Canyon
1
Le nombre de lignes n'est pas précis mais "Auto_increment" peut vous donner un nombre précis si vous n'avez supprimé aucune ligne de ces tables.
Peter T.
13
SELECT TABLE_NAME,SUM(TABLE_ROWS)FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA ='your_db'GROUPBY TABLE_NAME;
produit des lignes de table estimées - comparer à "mysql_num_rows ($ tableresult)"
Kreeverp
1
c'est la meilleure réponse en fait! Aussi le plus simple à exécuter depuis mysql cli:mysql> SELECT TABLE_NAME,SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ngramsdb' GROUP BY TABLE_NAME;
loretoparisi
11
Cette procédure stockée répertorie les tables, compte les enregistrements et produit un nombre total d'enregistrements à la fin.
Pour l'exécuter après avoir ajouté cette procédure:
CALL `COUNT_ALL_RECORDS_BY_TABLE`();
-
La procédure:
DELIMITER $$CREATE DEFINER=`root`@`127.0.0.1`PROCEDURE`COUNT_ALL_RECORDS_BY_TABLE`()BEGINDECLARE done INT DEFAULT0;DECLARE TNAME CHAR(255);DECLARE table_names CURSORforSELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA =DATABASE();DECLARECONTINUE HANDLER FORNOT FOUND SET done =1;OPEN table_names;DROPTABLEIFEXISTS TCOUNTS;CREATE TEMPORARY TABLE TCOUNTS
(
TABLE_NAME CHAR(255),
RECORD_COUNT INT
) ENGINE = MEMORY;WHILE done =0 DO
FETCH NEXT FROM table_names INTO TNAME;IF done =0THENSET@SQL_TXT = CONCAT("INSERT INTO TCOUNTS(SELECT '", TNAME ,"' AS TABLE_NAME, COUNT(*) AS RECORD_COUNT FROM ", TNAME,")");
PREPARE stmt_name FROM@SQL_TXT;EXECUTE stmt_name;DEALLOCATE PREPARE stmt_name;ENDIF;ENDWHILE;CLOSE table_names;SELECT*FROM TCOUNTS;SELECT SUM(RECORD_COUNT)AS TOTAL_DATABASE_RECORD_CT FROM TCOUNTS;END
Il y a un peu de hack / contournement à ce problème d'estimation.
Auto_Increment - pour une raison quelconque, cela renvoie un nombre de lignes beaucoup plus précis pour votre base de données si l'incrémentation automatique est configurée sur les tables.
J'ai trouvé cela en explorant pourquoi les informations de la table d'affichage ne correspondaient pas aux données réelles.
Vous pouvez ensuite facilement utiliser PHP ou autre pour renvoyer le maximum des 2 colonnes de données pour donner la "meilleure estimation" pour le nombre de lignes.
L'incrémentation automatique sera toujours +1 * (nombre de tables), mais même avec 4000 tables et 3 millions de lignes, c'est une précision de 99,9%. Beaucoup mieux que les lignes estimées.
La beauté de ceci est que le nombre de lignes renvoyé dans performance_schema est également effacé pour vous, car le plus grand ne fonctionne pas sur les valeurs nulles. Cependant, cela peut être un problème si vous n'avez pas de tables avec incrémentation automatique.
Vous pouvez essayer ça. Cela fonctionne bien pour moi.
SELECT IFNULL(table_schema,'Total')"Database",TableCount
FROM(SELECT COUNT(1) TableCount,table_schema
FROM information_schema.tables
WHERE table_schema NOTIN('information_schema','mysql')GROUPBY table_schema WITH ROLLUP) A;
Si vous utilisez la base de données information_schema, vous pouvez utiliser ce code mysql (la partie where fait que la requête n'affiche pas les tables qui ont une valeur nulle pour les lignes):
La requête suivante produit une requête (nother) qui obtiendra la valeur de count (*) pour chaque table, à partir de chaque schéma, répertoriée dans information_schema.tables. Le résultat complet de la requête présentée ici - toutes les lignes prises ensemble - comprend une instruction SQL valide se terminant par un point-virgule - sans «union» pendante. L'union pendante est évitée en utilisant une union dans la requête ci-dessous.
select concat('select "', table_schema,'.', table_name,'" as `schema.table`,
count(*)
from ', table_schema,'.', table_name,' union ')as'Query Row'from information_schema.tables
unionselect'(select null, null limit 0);';
Une autre option: pour les non InnoDB, il utilise les données de information_schema.TABLES (car c'est plus rapide), pour InnoDB - sélectionnez count (*) pour obtenir le décompte précis. Il ignore également les vues.
SET@table_schema =DATABASE();-- or SET @table_schema = 'my_db_name';SET GROUP_CONCAT_MAX_LEN=131072;SET@selects =NULL;SELECT GROUP_CONCAT('SELECT "', table_name,'" as TABLE_NAME, COUNT(*) as TABLE_ROWS FROM `', table_name,'`'
SEPARATOR '\nUNION\n')INTO@selects
FROM information_schema.TABLES
WHERE TABLE_SCHEMA =@table_schema
AND ENGINE ='InnoDB'AND TABLE_TYPE ="BASE TABLE";SELECT CONCAT_WS('\nUNION\n',
CONCAT('SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND ENGINE <> "InnoDB" AND TABLE_TYPE = "BASE TABLE"'),@selects)INTO@selects;
PREPARE stmt FROM@selects;EXECUTE stmt USING@table_schema;DEALLOCATE PREPARE stmt;
Si votre base de données contient beaucoup de grandes tables InnoDB, le comptage de toutes les lignes peut prendre plus de temps.
Pourquoi n'utilisez-vous pas count (*) si vous ignorez les données?
Svetoslav Marinov
0
L'affiche voulait le nombre de lignes sans compter, mais n'a pas précisé quel moteur de table. Avec InnoDB, je ne connais qu'une seule façon, c'est de compter.
Voici comment je cueille mes pommes de terre:
# Put this functionin your bash and call with:# rowpicker DBUSER DBPASS DBNAME [TABLEPATTERN]function rowpicker(){
UN=$1
PW=$2
DB=$3if[!-z "$4"];then
PAT="LIKE '$4'"
tot=-2else
PAT=""
tot=-1
fi
for t in`mysql -u "$UN"-p"$PW""$DB"-e "SHOW TABLES $PAT"`;do
if[$tot -lt 0];then
echo "Skipping $t";
let "tot += 1";else
c=`mysql -u "$UN"-p"$PW""$DB"-e "SELECT count(*) FROM $t"`;
c=`echo $c | cut -d " "-f 2`;
echo "$t: $c";
let "tot += c";
fi;
done;
echo "total rows: $tot"}
Je ne fais aucune affirmation à ce sujet autre que le fait que c'est un moyen vraiment laid mais efficace pour obtenir le nombre de lignes dans chaque table de la base de données, quel que soit le moteur de table et sans avoir à avoir la permission d'installer des procédures stockées, et sans avoir besoin d'installer rubis ou php. Oui, c'est rouillé. Oui ça compte. count (*) est précis.
Sur la base de la réponse de @ Nathan ci-dessus, mais sans avoir besoin de "supprimer l'union finale" et avec l'option de trier la sortie, j'utilise le SQL suivant. Il génère une autre instruction SQL qui s'exécute ensuite:
select CONCAT('select * from (\n', group_concat( single_select SEPARATOR ' UNION\n'),'\n ) Q order by Q.exact_row_count desc')as sql_query
from(SELECT CONCAT('SELECT "',
table_name,'" AS table_name, COUNT(1) AS exact_row_count
FROM `',
table_schema,'`.`',
table_name,'`')as single_select
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema ='YOUR_SCHEMA_NAME'and table_type ='BASE TABLE') Q
Vous avez besoin d'une valeur de group_concat_max_lenvariable de serveur suffisamment grande, mais à partir de MariaDb 10.2.4, elle devrait par défaut être 1M.
Le code ci-dessous génère la requête de sélection pour tous les contes. Il suffit de supprimer le dernier "UNION ALL", de sélectionner tous les résultats et de coller une nouvelle fenêtre de requête à exécuter.
SELECT
concat('select ''', table_name ,''' as TableName, COUNT(*) as RowCount from ', table_name ,' UNION ALL ')as TR FROM
information_schema.tables where
table_schema ='Database Name'
Si vous connaissez le nombre de tables et leurs noms, et en supposant qu'elles ont chacune des clés primaires, vous pouvez utiliser une jointure croisée en combinaison avec COUNT(distinct [column])pour obtenir les lignes provenant de chaque table:
Réponses:
Remarque dans la documentation: pour les tables InnoDB, le nombre de lignes n'est qu'une estimation approximative utilisée dans l'optimisation SQL. Vous devrez utiliser COUNT (*) pour les nombres exacts (ce qui est plus cher).
la source
Vous pouvez probablement mettre quelque chose ensemble avec la table Tables . Je ne l'ai jamais fait, mais il semble qu'il y ait une colonne pour TABLE_ROWS et une pour TABLE NAME .
Pour obtenir des lignes par table, vous pouvez utiliser une requête comme celle-ci:
la source
Comme @Venkatramanan et d'autres, j'ai trouvé INFORMATION_SCHEMA.TABLES peu fiable (en utilisant InnoDB, MySQL 5.1.44), donnant des nombres de lignes différents chaque fois que je l'exécute, même sur des tables au repos. Voici un moyen relativement hacky (mais flexible / adaptable) de générer une grosse instruction SQL que vous pouvez coller dans une nouvelle requête, sans installer de gemmes Ruby ni d'autres choses.
Il produit une sortie comme celle-ci:
Copiez et collez à l'exception de la dernière UNION pour obtenir une sortie agréable comme,
la source
Je viens de courir:
Cela vous donnera le nombre de lignes pour CHAQUE table plus un tas d'autres informations. J'avais l'habitude d'utiliser la réponse sélectionnée ci-dessus, mais c'est beaucoup plus facile.
Je ne sais pas si cela fonctionne avec toutes les versions, mais j'utilise 5.5 avec le moteur InnoDB.
la source
C'est tout ce dont vous avez besoin.
la source
mysql> SELECT TABLE_NAME,SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ngramsdb' GROUP BY TABLE_NAME;
Cette procédure stockée répertorie les tables, compte les enregistrements et produit un nombre total d'enregistrements à la fin.
Pour l'exécuter après avoir ajouté cette procédure:
-
La procédure:
la source
Manière simple:
Exemple de résultat:
la source
Il y a un peu de hack / contournement à ce problème d'estimation.
Auto_Increment - pour une raison quelconque, cela renvoie un nombre de lignes beaucoup plus précis pour votre base de données si l'incrémentation automatique est configurée sur les tables.
J'ai trouvé cela en explorant pourquoi les informations de la table d'affichage ne correspondaient pas aux données réelles.
Vous pouvez ensuite facilement utiliser PHP ou autre pour renvoyer le maximum des 2 colonnes de données pour donner la "meilleure estimation" pour le nombre de lignes.
c'est à dire
L'incrémentation automatique sera toujours +1 * (nombre de tables), mais même avec 4000 tables et 3 millions de lignes, c'est une précision de 99,9%. Beaucoup mieux que les lignes estimées.
La beauté de ceci est que le nombre de lignes renvoyé dans performance_schema est également effacé pour vous, car le plus grand ne fonctionne pas sur les valeurs nulles. Cependant, cela peut être un problème si vous n'avez pas de tables avec incrémentation automatique.
la source
Vous pouvez essayer ça. Cela fonctionne bien pour moi.
la source
Si vous utilisez la base de données information_schema, vous pouvez utiliser ce code mysql (la partie where fait que la requête n'affiche pas les tables qui ont une valeur nulle pour les lignes):
la source
La requête suivante produit une requête (nother) qui obtiendra la valeur de count (*) pour chaque table, à partir de chaque schéma, répertoriée dans information_schema.tables. Le résultat complet de la requête présentée ici - toutes les lignes prises ensemble - comprend une instruction SQL valide se terminant par un point-virgule - sans «union» pendante. L'union pendante est évitée en utilisant une union dans la requête ci-dessous.
la source
Voici ce que je fais pour obtenir le nombre réel (pas d'utilisation du schéma)
C'est plus lent mais plus précis.
C'est un processus en deux étapes à
Obtenez la liste des tables pour votre base de données. Vous pouvez l'obtenir en utilisant
Créez et assignez la liste des tables à la variable de tableau dans ce script bash (séparées par un seul espace comme dans le code ci-dessous)
Exécuter:
la source
Une autre option: pour les non InnoDB, il utilise les données de information_schema.TABLES (car c'est plus rapide), pour InnoDB - sélectionnez count (*) pour obtenir le décompte précis. Il ignore également les vues.
Si votre base de données contient beaucoup de grandes tables InnoDB, le comptage de toutes les lignes peut prendre plus de temps.
la source
Voici comment je compte les TABLES et TOUS LES ENREGISTREMENTS en utilisant PHP:
la source
L'affiche voulait le nombre de lignes sans compter, mais n'a pas précisé quel moteur de table. Avec InnoDB, je ne connais qu'une seule façon, c'est de compter.
Voici comment je cueille mes pommes de terre:
Je ne fais aucune affirmation à ce sujet autre que le fait que c'est un moyen vraiment laid mais efficace pour obtenir le nombre de lignes dans chaque table de la base de données, quel que soit le moteur de table et sans avoir à avoir la permission d'installer des procédures stockées, et sans avoir besoin d'installer rubis ou php. Oui, c'est rouillé. Oui ça compte. count (*) est précis.
la source
Sur la base de la réponse de @ Nathan ci-dessus, mais sans avoir besoin de "supprimer l'union finale" et avec l'option de trier la sortie, j'utilise le SQL suivant. Il génère une autre instruction SQL qui s'exécute ensuite:
Vous avez besoin d'une valeur de
group_concat_max_len
variable de serveur suffisamment grande, mais à partir de MariaDb 10.2.4, elle devrait par défaut être 1M.la source
Le code ci-dessous génère la requête de sélection pour tous les contes. Il suffit de supprimer le dernier "UNION ALL", de sélectionner tous les résultats et de coller une nouvelle fenêtre de requête à exécuter.
la source
Si vous voulez les nombres exacts, utilisez le script ruby suivant. Vous avez besoin de Ruby et RubyGems.
Installez les gemmes suivantes:
Fichier: count_table_records.rb
Revenez à la ligne de commande:
Production:
la source
Si vous connaissez le nombre de tables et leurs noms, et en supposant qu'elles ont chacune des clés primaires, vous pouvez utiliser une jointure croisée en combinaison avec
COUNT(distinct [column])
pour obtenir les lignes provenant de chaque table:Voici un exemple SQL Fiddle .
la source