perlihatkan nama tabel + jumlah catatan untuk setiap tabel dalam database innodb mysql

10

Cara daftar semua tabel di database saat ini, bersama-sama jumlah baris tabel.

Dengan kata lain, dapatkah Anda memikirkan permintaan untuk membuat sesuatu seperti ini di mysql?

+------------------------++------------------------+
| Tables_in_database     |  Number of rows         |
+------------------------++------------------------+
| database 1             |   1000                  |
| database 2             |   1500                  |
+------------------------++------------------------+

Berbagai pendekatan disambut.

sjdh
sumber
Apakah Anda menggunakan MyISAM atau InnoDB? Sudahkah Anda melihat pertanyaan ini ?
Aaron Bertrand
@ AaronBertrand Terima kasih, pertanyaan itu menarik. Saya menggunakan
innodb

Jawaban:

8

Saya memiliki pendekatan yang sangat agresif menggunakan brute force Dynamic SQL

SET group_concat_max_len = 1024 * 1024 * 100;
SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
INTO @sql FROM (SELECT table_schema db,table_name tb
FROM information_schema.tables WHERE table_schema = DATABASE()) A;
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

Contoh: Dalam database pengujian saya, saya mendapatkan ini

mysql> use test
Database changed
mysql> SET group_concat_max_len = 1024 * 1024 * 100;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
    '> COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
    -> INTO @sql FROM (SELECT table_schema db,table_name tb
    -> FROM information_schema.tables WHERE table_schema = DATABASE()) A;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

+--------------------+----------------+
| Tables_in_database | Number of Rows |
+--------------------+----------------+
| biblio             |              3 |
| biblio_old         |              7 |
| dep                |              5 |
| e                  |             14 |
| emp                |              4 |
| fruit              |             12 |
| fruit_outoforder   |             12 |
| nums_composite     |              0 |
| nuoji              |              4 |
| prod               |              3 |
| prodcat            |              6 |
| test2              |              9 |
| worktable          |              5 |
| yoshi_scores       |             24 |
+--------------------+----------------+
14 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

COBALAH !!!

CAVEAT: Jika semua tabel adalah MyISAM, ini akan terjadi dengan sangat cepat. Jika semua tabel adalah InnoDB, setiap tabel akan dihitung. Ini mungkin brutal dan tidak henti-hentinya untuk tabel InnoDB yang sangat besar.

RolandoMySQLDBA
sumber
Ini adalah contoh yang bagus dari SQL dinamis. Terima kasih!
sjdh
Saya mencoba menggantinya FROM information_schema.tablesdengan FROM show tables. Bisakah Anda jelaskan mengapa itu tidak berhasil?
sjdh
Wow ini sangat berguna !!
Tommy
Saya akan senang melihat versi ini yang berulang di semua database. Saya mencoba menjalankan SELECT DISTINCT table_schema FROM information_schema.tablestetapi tidak tahu cara membungkus kueri Anda untuk menjalankan seluruh hasil itu. Jika saya mengetahui jawabannya, saya akan memposting di dba.stackexchange.com/q/201880/18098
Ryan
Sebenarnya saya menemukan bahwa Anda sudah menjawab di dba.stackexchange.com/a/102284/18098 tetapi setidaknya ada satu kesalahan ketik. Bahkan setelah saya memperbaiki "DEALLCOATE", saya tidak bisa menjalankan versi Semua Database Anda. Saya tidak terbiasa denganSELECT @CountSQL\G
Ryan
6

Coba kueri di bawah ini tanpa kueri dinamis

SELECT Table_name AS TablesInDatabase ,table_rows AS NumberOfRows 
FROM information_schema.tables 
WHERE Table_schema=DATABASE(); 
Pydi Raju
sumber
1
Metode ini hanya dapat diandalkan dengan semua-MyISAM database. InnoDB tidak menyimpan jumlah baris di bagian mana pun dari arsitekturnya, atau di INFORMATION_SCHEMA. (Lihat posting saya dba.stackexchange.com/questions/17926/… ). Pendekatan dinamis terhadap INFORMATION_SCHEMA adalah satu-satunya cara untuk tabel InnoDB.
RolandoMySQLDBA
Terima kasih telah berbagi metode ini. Saya dapat mengkonfirmasi bahwa metode ini memberikan jumlah yang sedikit berbeda untuk beberapa tabel saya. Semua tabel saya disimpan di mesin penyimpanan InnoDB.
sjdh
jawaban terbaik, bekerja seperti pesona.
Pablo Pazos
1

Mungkin pertanyaan ini bisa membantu. Ini menunjukkan ukuran data dan jumlah catatan.

SET @table=(SELECT DATABASE());
select @table;
SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`,
     table_rows as 'Rows'
FROM information_schema.TABLES 
WHERE table_schema = @table
ORDER BY (data_length + index_length) DESC;
RikW
sumber
1

Dapatkan Hitungan Baris yang tepat untuk Semua Tabel di MySQL menggunakan skrip shell.

atur parameter dalam file parameter.config sebagai

# Server Details
host_server=10.109.25.37

# Mysql credentials
mysql_user=root
mysql_pass=root
mysql_port=3306

Script untuk dihitung adalah:

#!/bin/bash
# This Script is used to take rows count of mysql all user database

# Read Parameter
source parameter.config

# Find path
MY_PATH="`dirname \"$0\"`"
#echo "$MY_PATH"

start=`date +%s`
echo -e "\n\n"
echo MySQL script start runing at Date and Time is: `date +"%D %T"`
echo -e "@@@ Start of rows Count of MySQL on Old Ficus Release $host_server @@@"

echo -e "\n***** MySQL Rows Count Start *****"

#Make directory to save rows count
NOW="$(date +%Y%m%dT%H%M%S)"
dir_name="mysqlRows_$host_server"
if [ ! -d "$MY_PATH/$dir_name" ]; then
    mkdir "$MY_PATH/$dir_name"
fi
echo -e "\n..... Directory $dir_name is Created for mysql....."

echo -e "\n..... Check MySQL Connection ....."
# Verifying mysql connections on new release machine
MYSQL_CONN="-u$mysql_user -p$mysql_pass -h$host_server"
mysql ${MYSQL_CONN} -e "exit"
if [ $? -eq 0 ];
then
    echo -e "\n..... MySQL Database Connection Successful on server $host_server ....."
else
    echo -e "\n..... MySQL Database Connection Fail. Please verify $host_server credential ....."
    exit
fi

echo -e "\nReading MySQL database names..."
mysql ${MYSQL_CONN} -ANe "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema')" > $MY_PATH/$dir_name/dbs_$NOW.txt
DBS="$(cat $MY_PATH/$dir_name/dbs_$NOW.txt)"
# echo -e "\nList of databases:\t" ${DBS}

echo -e "\n..... Running for row count of tables of all user databases ....."

# All User databases
for db in ${DBS[@]}
do
    # echo $db , ${db[@]} 
    # Find list of database
    echo -e "\n\t... Running for ${db[@]} database tables list ..."
    mysql ${MYSQL_CONN} -ANe "SELECT  TABLE_NAME FROM information_schema.TABLES WHERE  TABLE_SCHEMA IN ('${db[@]}')" > $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt
    TBL="$(cat $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt)"
    # echo "Table in $db are:" ${TBL[@]}, $MY_PATH/$dir_name/${db[@]}_tables.txt

    echo -e "\n\t... Running for ${db[@]} database tables rows count ..."
    for tbs in ${TBL[@]}
    do
        # echo $tbs , ${tbs[@]}
        count=$(mysql -u$mysql_user -p$mysql_pass -h$host_server ${db[@]} -N -e "select count(*) from ${tbs[@]}")
        # count="$(cat /tmp/$db_rows_$NOW.txt)"
        # echo "Row in $tb Table of $db database are:" ${count[@]}
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/${db[@]}_rows_$NOW.csv
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/alldbs_rows_$NOW.csv
    done
done
echo -e "\n..... End of rows count of tables of all databases ....."

echo -e "\n===== MySQL Rows Count End ====="

# Display script execution time.
echo -e "@@@ Completion of Rows Count of MySQL on old Release $host_server @@@"
echo Script ended at Date and Time is: `date +"%D %T"`
end=`date +%s`
runtime=$((end-start))
echo -e "Time(in second) taken for running MySQL row count script:" $runtime "Sec."

simpan ini di file "mysqlrowscount.sh", Jalankan skrip ini menggunakan perintah:

bash mysqlrowscount.sh
Sarita
sumber