MySQL 데이터베이스의 모든 테이블에 대한 레코드 수 가져오기
하지 않고 MySQL 행할 수 있는 ?SELECT count()
★★★★★★★★★★★★★★★★?
SELECT SUM(TABLE_ROWS)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{your_db}';
다만, 다음의 문서를 참조해 주세요.InnoDB 테이블의 경우 행 수는 SQL 최적화에 사용되는 대략적인 추정치일 뿐입니다.정확한 카운트에는 카운트(*)를 사용해야 합니다(비용이 더 쌉니다).
테이블 테이블과 함께 무언가를 조합할 수 있습니다.해본 적은 없지만 TABLE_ROWS와 TABLE NAME의 각 컬럼이 있는 것 같습니다.
테이블당 행을 가져오려면 다음과 같은 쿼리를 사용할 수 있습니다.
SELECT table_name, table_rows
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '**YOUR SCHEMA**';
@Benkatramanan과 같이 INFORMATION_SCHEMA를 찾았습니다.테이블(InnoDB, MySQL 5.1.44 사용)을 사용하면 정지된 테이블에서도 실행할 때마다 행 수가 달라집니다.이것은 Ruby 보석 등을 설치하지 않고도 새로운 쿼리에 붙여넣을 수 있는 비교적 해킹적인(그러나 유연하고 적응 가능한) 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)
그냥 뛰어요.
show table status;
그러면 모든 테이블의 행 수와 기타 정보가 표시됩니다.나는 위에서 선택한 답을 사용했지만, 이것이 훨씬 더 쉽다.
모든 버전에서 사용할 수 있을지는 모르겠지만, InnoDB 엔진을 사용하여 5.5를 사용하고 있습니다.
간단한 방법:
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 |
+----------------+-----------------+
SELECT TABLE_NAME,SUM(TABLE_ROWS)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_db'
GROUP BY TABLE_NAME;
그것만 있으면 돼
이 스토어드 프로시저는 테이블을 나열하고 레코드를 카운트하며 마지막에 총 레코드 수를 생성합니다.
이 절차를 추가한 후 실행하려면:
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
이 견적 문제에는 약간의 해결 방법이 있다.
Auto_Increment - 테이블에 자동 증분이 설정되어 있는 경우 어떤 이유로 인해 데이터베이스에 대해 훨씬 정확한 행 수가 반환됩니다.
show table info가 실제 데이터와 일치하지 않는 이유를 조사하던 중 이 사실을 발견했습니다.
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 등을 사용하여 2개의 데이터 열 중 최대값을 반환하여 행 수에 대한 "최적의 추정치"를 제공할 수 있습니다.
예.
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;
Auto Increment는 항상 +1 * (테이블 수) 행에서 제외되지만, 4,000개의 테이블과 300만 개의 행에서도 99.9% 정확합니다.예상된 행보다 훨씬 낫습니다.
이 방법의 장점은 performance_schema에서 반환된 행 개수도 지워진다는 것입니다.그 이유는 null에서는 greatest가 동작하지 않기 때문입니다.단, 자동 증분 테이블이 없는 경우 이 문제가 발생할 수 있습니다.
또 하나의 옵션: InnoDB 이외의 경우 information_schema의 데이터를 사용합니다.TABLEs(빠를수록 빠를수록), InnoDB의 경우 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 테이블이 많을 경우 모든 행을 세는 데 시간이 더 걸릴 수 있습니다.
이거 드셔보세요.저는 잘 되고 있어요.
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;
데이터베이스 information_schema를 사용하는 경우 다음 mysql 코드를 사용할 수 있습니다(여기서 부분에서는 행 값이 null인 테이블을 쿼리에 표시하지 않습니다).
SELECT TABLE_NAME, TABLE_ROWS
FROM `TABLES`
WHERE `TABLE_ROWS` >=0
다음 쿼리는 information_schema.tables에 나열된 모든 스키마에서 모든 테이블의 카운트(*) 값을 가져오는 (nother) 쿼리를 생성합니다.여기에 표시된 쿼리의 전체 결과(모든 행이 함께 사용됨)는 세미콜론으로 끝나는 유효한 SQL 문으로 구성됩니다. 'union'은 중단되지 않습니다.아래 쿼리에서 유니언을 사용하면 유니언이 매달리는 것을 피할 수 있습니다.
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);';
이것이 실제 카운트를 얻기 위해 수행하는 작업입니다(스키마 사용 안 함).
더 느리지만 더 정확합니다.
이 과정은 2단계 과정입니다.
DB 테이블 목록을 가져옵니다.를 사용하여 입수할 수 있습니다.
mysql -uroot -p mydb -e "show tables"
이 bash 스크립트에서 테이블 목록을 생성하여 어레이 변수에 할당합니다(아래 코드와 같이 공백으로 구분).
array=( table1 table2 table3 ) for i in "${array[@]}" do echo $i mysql -uroot mydb -e "select count(*) from $i" done
실행:
chmod +x script.sh; ./script.sh
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.";
포스터가 카운트하지 않고 행 수를 원했지만 테이블 엔진을 지정하지 않았습니다.InnoDB를 사용한다면, 나는 오직 한가지 방법밖에 모른다. 그것은 중요하다.
내 감자는 이렇게 따는 거예요.
# 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를 설치하지 않아도 데이터베이스의 각 테이블에 몇 개의 행이 있는지 알 수 있는 매우 추악하지만 효과적인 방법이라는 것 외에는 단언할 수 없습니다.네, 녹슬었어요.네, 중요하죠.count ( )는 정확합니다.
위의 @Nathan의 답변에 기초하여 "최종 결합을 제거"할 필요가 없으며 출력을 정렬하는 옵션과 함께 다음 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.21M로 하다
이게 왜 그렇게 힘들어야 하는지 모르겠지만 그게 인생이야.여기 실제 카운트를 실행하는 bash 스크립트가 있습니다.이것을 (예를 들어 count_rows.sh)로 저장하고 실행 가능한 파일(예를 들어 chmod 755 count_rows.sh)로 하여 실행합니다(예:/count_rows.sh).
#!/bin/bash
readarray -t TABLES < <(mysql --skip-column-names -u myuser -pmypassword mydbname -e "show tables")
# now we have an array like:
# TABLES='([0]="customer" [1]="order" [2]="product")'
# You can print out the array with:
#declare -p TABLES
for i in "${TABLES[@]}"
do
#echo $i
COUNT=$(mysql --skip-column-names -u username -pmypassword mydbname -e "select count(*) from $i")
echo $i : $COUNT
done
정확한 숫자를 알고 싶다면 다음 루비 스크립트를 사용하십시오.루비와 루비젬스가 필요합니다.
다음 Gem 설치:
$> 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.
아래 코드는 모든 이야기에 대한 선택 쿼리를 생성합니다.마지막 "UNION ALL"을 삭제하고 모든 결과를 선택한 후 새 쿼리 창을 붙여넣으면 실행할 수 있습니다.
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'
테이블 수와 그 이름을 알고 있고 각각 프라이머리 키가 있다고 가정할 경우 크로스 조인(cross join)을 사용하여COUNT(distinct [column])
각 테이블에서 행을 가져오려면:
SELECT
COUNT(distinct t1.id) +
COUNT(distinct t2.id) +
COUNT(distinct t3.id) AS totalRows
FROM firstTable t1, secondTable t2, thirdTable t3;
언급URL : https://stackoverflow.com/questions/286039/get-record-counts-for-all-tables-in-mysql-database
'programing' 카테고리의 다른 글
MySQL의 트리 구조 테이블을 한 번에 조회할 수 있습니까? (0) | 2022.10.18 |
---|---|
os/path 형식에 관계없이 경로에서 파일 이름 추출 (0) | 2022.10.18 |
jQuery 옵션을 선택했는지 여부를 확인합니다. 선택하지 않은 경우 기본값을 선택하십시오. (0) | 2022.10.18 |
php.ini 파일(xampp)을 찾는 방법 (0) | 2022.10.18 |
xampp를 사용하는 C#의 MySql 오류 1064 (0) | 2022.10.18 |