[SQL] MySQL 데이터베이스의 모든 테이블에 대한 기록 수를 가져옵니다
SQLMySQL 데이터베이스의 모든 테이블에 대한 기록 수를 가져옵니다
각 테이블에 SELECT COUNT ()를 실행하지 않고 MySQL 데이터베이스의 모든 테이블의 행 수를 얻을 수있는 방법이 있나요?
해결법
-
==============================
1.
SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{your_db}';
워드 프로세서 생각에서 참고 : InnoDB 테이블의 경우는, 행 수는 SQL 최적화에 사용되는 대략적인 예상이다. 당신은 (더 비싼이다) 정확한 계산을 위해 사용 COUNT (*)로해야합니다.
-
==============================
2.당신은 아마 테이블 테이블과 함께 뭔가를 넣을 수 있습니다. 나는 그것을 해본 적이 없다, 그러나 테이블 이름에 대한 TABLE_ROWS에 대한 열 하나가있는 것 같습니다.
당신은 아마 테이블 테이블과 함께 뭔가를 넣을 수 있습니다. 나는 그것을 해본 적이 없다, 그러나 테이블 이름에 대한 TABLE_ROWS에 대한 열 하나가있는 것 같습니다.
테이블 당 행을 얻으려면, 당신은이 같은 쿼리를 사용할 수 있습니다 :
SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '**YOUR SCHEMA**';
-
==============================
3.@Venkatramanan 다른 사람들과 마찬가지로 나는 다른 행 카운트를 내가 심지어 중지 된 테이블에서 실행마다 제공 (이노, MySQL은 5.1.44을 사용) 신뢰할 수없는 INFORMATION_SCHEMA.TABLES을 발견했다. 다음은 새 쿼리에 붙여 넣을 수있는 큰 SQL 문을 생성하는 상대적으로 해키 (그러나 유연한 / 적응) 방법은 루비 보석과 물건을 설치하지 않고 있습니다.
@Venkatramanan 다른 사람들과 마찬가지로 나는 다른 행 카운트를 내가 심지어 중지 된 테이블에서 실행마다 제공 (이노, MySQL은 5.1.44을 사용) 신뢰할 수없는 INFORMATION_SCHEMA.TABLES을 발견했다. 다음은 새 쿼리에 붙여 넣을 수있는 큰 SQL 문을 생성하는 상대적으로 해키 (그러나 유연한 / 적응) 방법은 루비 보석과 물건을 설치하지 않고 있습니다.
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**';
그것은 다음과 같은 출력을 생성합니다 :
SELECT "func" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.func UNION SELECT "general_log" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.general_log UNION SELECT "help_category" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_category UNION SELECT "help_keyword" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_keyword UNION SELECT "help_relation" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_relation UNION SELECT "help_topic" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_topic UNION SELECT "host" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.host UNION SELECT "ndb_binlog_index" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.ndb_binlog_index UNION
복사 마지막 UNION 같은 좋은 결과를 얻을 제외하고 붙여 넣기,
+------------------+-----------------+ | table_name | exact_row_count | +------------------+-----------------+ | func | 0 | | general_log | 0 | | help_category | 37 | | help_keyword | 450 | | help_relation | 990 | | help_topic | 504 | | host | 0 | | ndb_binlog_index | 0 | +------------------+-----------------+ 8 rows in set (0.01 sec)
-
==============================
4.난 그냥 실행
난 그냥 실행
show table status;
이것은마다 테이블의 행 수를 더한 기타 정보의 무리를 줄 것이다. 나는 위의 선택한 답변을 사용하는 데 사용하지만,이 훨씬 쉽습니다.
모든 버전이 작품,하지만 난 이노 엔진 5.5를 사용하고 있는지 확실하지 않습니다.
-
==============================
5.
SELECT TABLE_NAME,SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db' GROUP BY TABLE_NAME;
즉 당신이 필요로하는 모든입니다.
-
==============================
6.이것은 카운트 기록을 프로 시저 목록 테이블을 저장하고, 마지막에 레코드 수를 생성합니다.
이것은 카운트 기록을 프로 시저 목록 테이블을 저장하고, 마지막에 레코드 수를 생성합니다.
이 절차를 추가 한 후이를 실행하려면 :
CALL `COUNT_ALL_RECORDS_BY_TABLE` ();
-
절차:
DELIMITER $$ CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `COUNT_ALL_RECORDS_BY_TABLE`() BEGIN DECLARE done INT DEFAULT 0; DECLARE TNAME CHAR(255); DECLARE table_names CURSOR for SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE(); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN table_names; DROP TABLE IF EXISTS 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 = 0 THEN SET @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; END IF; END WHILE; CLOSE table_names; SELECT * FROM TCOUNTS; SELECT SUM(RECORD_COUNT) AS TOTAL_DATABASE_RECORD_CT FROM TCOUNTS; END
-
==============================
7.간단한 방법 :
간단한 방법 :
SELECT TABLE_NAME, SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{Your_DB}' GROUP BY TABLE_NAME;
예 결과 :
+----------------+-----------------+ | TABLE_NAME | SUM(TABLE_ROWS) | +----------------+-----------------+ | calls | 7533 | | courses | 179 | | course_modules | 298 | | departments | 58 | | faculties | 236 | | modules | 169 | | searches | 25423 | | sections | 532 | | universities | 57 | | users | 10293 | +----------------+-----------------+
-
==============================
8.이 작업을 시도 할 수 있습니다. 그것은 나를 위해 잘 작동합니다.
이 작업을 시도 할 수 있습니다. 그것은 나를 위해 잘 작동합니다.
SELECT IFNULL(table_schema,'Total') "Database",TableCount FROM (SELECT COUNT(1) TableCount,table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') GROUP BY table_schema WITH ROLLUP) A;
-
==============================
9.이 추정 문제에 대한 해킹 / 해결의 비트가 있습니다.
이 추정 문제에 대한 해킹 / 해결의 비트가 있습니다.
AUTO_INCREMENT - 어떤 이유로 데이터베이스에 대해이 반환 훨씬 더 정확한 행 개수는 자동 증가가 테이블에 설정 한 경우.
테이블 표시 정보가 실제 데이터와 일치하지 않는 이유를 탐험 때 발견.
SELECT table_schema 'Database', SUM(data_length + index_length) AS 'DBSize', SUM(TABLE_ROWS) AS DBRows, SUM(AUTO_INCREMENT) AS DBAutoIncCount FROM information_schema.tables GROUP BY table_schema; +--------------------+-----------+---------+----------------+ | Database | DBSize | DBRows | DBAutoIncCount | +--------------------+-----------+---------+----------------+ | Core | 35241984 | 76057 | 8341 | | information_schema | 163840 | NULL | NULL | | jspServ | 49152 | 11 | 856 | | mysql | 7069265 | 30023 | 1 | | net_snmp | 47415296 | 95123 | 324 | | performance_schema | 0 | 1395326 | NULL | | sys | 16384 | 6 | NULL | | WebCal | 655360 | 2809 | NULL | | WxObs | 494256128 | 530533 | 3066752 | +--------------------+-----------+---------+----------------+ 9 rows in set (0.40 sec)
그러면 쉽게 행 수에 대한 "최적 추정치"를 제공하기 위해이 데이터 열의 최대을 반환하는 PHP 또는 무엇이든을 사용할 수 있습니다.
즉
SELECT table_schema 'Database', SUM(data_length + index_length) AS 'DBSize', GREATEST(SUM(TABLE_ROWS), SUM(AUTO_INCREMENT)) AS DBRows FROM information_schema.tables GROUP BY table_schema;
자동 증가는 항상 +1 * (테이블 수)하지만, 심지어 99.9 % 정확 4,000 테이블과 300 만 행과 오프 행이 될 것입니다. 예상 행보다 훨씬 더.
이것의 아름다움은 가장 큰이 널 (null) 작업을하지 않기 때문에 performance_schema에 반환 된 행 카운트가뿐만 아니라, 당신을 위해 삭제하는 것입니다. 당신이 자동 증가와 아무 테이블이없는 경우, 그래도 문제가 될 수 있습니다.
-
==============================
10.데이터베이스의 INFORMATION_SCHEMA를 사용하는 경우, 당신은이 MySQL의 코드를 사용할 수 있습니다 (일부 쿼리 행에 대해 널 (null) 값이 테이블을 표시하지 만드는 곳) :
데이터베이스의 INFORMATION_SCHEMA를 사용하는 경우, 당신은이 MySQL의 코드를 사용할 수 있습니다 (일부 쿼리 행에 대해 널 (null) 값이 테이블을 표시하지 만드는 곳) :
SELECT TABLE_NAME, TABLE_ROWS FROM `TABLES` WHERE `TABLE_ROWS` >=0
-
==============================
11.다음 쿼리는 INFORMATION_SCHEMA.TABLES에 나열된 모든 스키마에서 모든 테이블의 COUNT (*)의 값을 얻을 것이다 (같아) 쿼리를 생성합니다. 함께 모든 행 - - 여기에 표시된 쿼리의 전체 결과없이 매달려 '노동 조합'- 세미콜론으로 끝나는 유효한 SQL 문을 포함한다. 매달려있는 노동 조합은 아래의 쿼리에서 노동 조합의 사용에 의해 피할 수있다.
다음 쿼리는 INFORMATION_SCHEMA.TABLES에 나열된 모든 스키마에서 모든 테이블의 COUNT (*)의 값을 얻을 것이다 (같아) 쿼리를 생성합니다. 함께 모든 행 - - 여기에 표시된 쿼리의 전체 결과없이 매달려 '노동 조합'- 세미콜론으로 끝나는 유효한 SQL 문을 포함한다. 매달려있는 노동 조합은 아래의 쿼리에서 노동 조합의 사용에 의해 피할 수있다.
select concat('select "', table_schema, '.', table_name, '" as `schema.table`, count(*) from ', table_schema, '.', table_name, ' union ') as 'Query Row' from information_schema.tables union select '(select null, null limit 0);';
-
==============================
12.이것은 내가 (어떤 스키마를 사용하여) 실제 수를 얻을 위해 할 것입니다
이것은 내가 (어떤 스키마를 사용하여) 실제 수를 얻을 위해 할 것입니다
그것은 느리지 만 더 정확합니다.
이 두 단계 과정에서의
-
==============================
13.또 하나의 옵션 (가 빠릅니다로) 비 이노 것이 이노를 들어, INFORMATION_SCHEMA.TABLES에서 데이터를 사용합니다 - SELECT COUNT (*)가 정확한 수를 얻을 수 있습니다. 또한 그것은 의견을 무시합니다.
또 하나의 옵션 (가 빠릅니다로) 비 이노 것이 이노를 들어, INFORMATION_SCHEMA.TABLES에서 데이터를 사용합니다 - SELECT COUNT (*)가 정확한 수를 얻을 수 있습니다. 또한 그것은 의견을 무시합니다.
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;
데이터베이스가 큰 InnoDB 테이블의 많은 경우 모든 행을 계산하는 것은 더 많은 시간이 걸릴 수 있습니다.
-
==============================
14.이것은 내가 테이블 및 모든 레코드 사용하여 PHP를 계산하는 방법이다 :
이것은 내가 테이블 및 모든 레코드 사용하여 PHP를 계산하는 방법이다 :
$dtb = mysql_query("SHOW TABLES") or die (mysql_error()); $jmltbl = 0; $jml_record = 0; $jml_record = 0; while ($row = mysql_fetch_array($dtb)) { $sql1 = mysql_query("SELECT * FROM " . $row[0]); $jml_record = mysql_num_rows($sql1); echo "Table: " . $row[0] . ": " . $jml_record record . "<br>"; $jmltbl++; $jml_record += $jml_record; } echo "--------------------------------<br>$jmltbl Tables, $jml_record > records.";
-
==============================
15.포스터는 계산하지 않고 행 수를 원하지만, 어떤 테이블 엔진을 지정하지 않았습니다. 이노으로, 나는 단지 계산하는 하나의 방법을 알고있다.
포스터는 계산하지 않고 행 수를 원하지만, 어떤 테이블 엔진을 지정하지 않았습니다. 이노으로, 나는 단지 계산하는 하나의 방법을 알고있다.
이것은 내가 내 감자를 선택하는 방법입니다 :
# Put this function in your bash and call with: # rowpicker DBUSER DBPASS DBNAME [TABLEPATTERN] function rowpicker() { UN=$1 PW=$2 DB=$3 if [ ! -z "$4" ]; then PAT="LIKE '$4'" tot=-2 else 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" }
나는, 설치 할 필요없이이 테이블 엔진에 관계없이 데이터베이스의 각 테이블에 존재하는 행 수를 얻을 수있는 정말 추한하지만 효과적인 방법이라고 이상의 저장 프로 시저를 설치할 수있는 권한이 필요없이이 기타에 대한 아무런 주장을하지 있어요 루비 또는 PHP. 예, 그 녹슨. 네, 그것은 계산합니다. (*) 정확한 계산.
-
==============================
16.를 기반으로하지만, 출력을 정렬하는 "최종 조합을 제거"로하고, 옵션 필요없이 위의 나단의 대답 @, 나는 다음과 같은 SQL을 사용합니다. 그런 다음 바로 실행 다른 SQL 문을 생성합니다 :
를 기반으로하지만, 출력을 정렬하는 "최종 조합을 제거"로하고, 옵션 필요없이 위의 나단의 대답 @, 나는 다음과 같은 SQL을 사용합니다. 그런 다음 바로 실행 다른 SQL 문을 생성합니다 :
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
당신은 group_concat_max_len 서버 변수의 충분히 큰 값을 필요합니까하지만 MariaDb 10.2.4에서는 1M 기본합니다.
-
==============================
17.당신이 정확한 숫자를 원하는 경우, 다음 루비 스크립트를 사용합니다. 당신은 루비와 루비 젬이 필요합니다.
당신이 정확한 숫자를 원하는 경우, 다음 루비 스크립트를 사용합니다. 당신은 루비와 루비 젬이 필요합니다.
다음 보석을 설치합니다 :
$> gem install dbi $> gem install dbd-mysql
파일 : count_table_records.rb
require 'rubygems' require 'dbi' db_handler = DBI.connect('DBI:Mysql:database_name:localhost', 'username', 'password') # Collect all Tables sql_1 = db_handler.prepare('SHOW tables;') sql_1.execute tables = sql_1.map { |row| row[0]} sql_1.finish tables.each do |table_name| sql_2 = db_handler.prepare("SELECT count(*) FROM #{table_name};") sql_2.execute sql_2.each do |row| puts "Table #{table_name} has #{row[0]} rows." end sql_2.finish end db_handler.disconnect
명령 줄로 이동 :
$> ruby count_table_records.rb
산출:
Table users has 7328974 rows.
-
==============================
18.당신은 테이블과 이름의 수를 알고, 가정하면 그들은 각각 각 테이블에서 오는 행을 얻기 위해 십자가 COUNT (별개의 [열])와 함께 참여 사용할 수있는 기본 키를 가지고 :
당신은 테이블과 이름의 수를 알고, 가정하면 그들은 각각 각 테이블에서 오는 행을 얻기 위해 십자가 COUNT (별개의 [열])와 함께 참여 사용할 수있는 기본 키를 가지고 :
SELECT COUNT(distinct t1.id) + COUNT(distinct t2.id) + COUNT(distinct t3.id) AS totalRows FROM firstTable t1, secondTable t2, thirdTable t3;
여기에 SQL 바이올린의 예입니다.
from https://stackoverflow.com/questions/286039/get-record-counts-for-all-tables-in-mysql-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 나는 각 사용자에 대한 최신 기록 날짜를 SQL 쿼리 어떻게 (0) | 2020.03.23 |
---|---|
[SQL] 외래 키는 NULL 및 / 또는 복제 될 수 있을까? (0) | 2020.03.23 |
[SQL] 다중 언어 데이터베이스 설계를위한 최상의 방법은 무엇입니까? [닫은] (0) | 2020.03.23 |
[SQL] 어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다? (0) | 2020.03.23 |
[SQL] 특정 필드에 중복을 찾기 위해 문을 선택 (0) | 2020.03.23 |