hiển thị tên bảng + số lượng bản ghi cho mỗi bảng trong cơ sở dữ liệu innodb mysql


10

Cách liệt kê tất cả các bảng trong cơ sở dữ liệu hiện tại, cùng với số lượng hàng của bảng.

Nói cách khác, bạn có thể nghĩ ra một truy vấn để đưa ra một cái gì đó như thế này trong mysql không?

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

Cách tiếp cận khác nhau được chào đón.


Bạn đang sử dụng MyISAM hoặc InnoDB? Bạn đã xem câu hỏi này chưa?
Aaron Bertrand

@AaronBertrand Cảm ơn, câu hỏi đó được đặt ra. Tôi sử dụng innodb
sjdh

Câu trả lời:


8

Tôi có một cách tiếp cận rất tích cực bằng cách sử dụng SQL động mạnh mẽ

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;

Ví dụ: Trong cơ sở dữ liệu thử nghiệm của tôi, tôi nhận được điều này

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>

HÃY THỬ MỘT LẦN !!!

CAVEAT: Nếu tất cả các bảng là MyISAM, điều này sẽ xảy ra rất nhanh. Nếu tất cả các bảng là InnoDB, mỗi bảng sẽ được tính. Điều này có thể tàn bạo và không ngừng đối với các bảng InnoDB rất lớn.


Đây là một ví dụ tuyệt vời về SQL động. Cảm ơn!
sjdh

Tôi đã cố gắng để thay thế FROM information_schema.tablesbằng FROM show tables. Bạn có thể giải thích tại sao điều đó không làm việc?
sjdh

Wow điều này cực kỳ hữu ích !!
Tommy

Tôi rất thích thấy một phiên bản này lặp đi lặp lại trên tất cả các cơ sở dữ liệu. Tôi đã thử chạy SELECT DISTINCT table_schema FROM information_schema.tablesnhưng không thể tìm ra cách bọc truy vấn của bạn để chạy trên các kết quả đó. Nếu tôi tìm ra câu trả lời, tôi sẽ đăng tại dba.stackexchange.com/q/201880/18098
Ryan

Trên thực tế tôi thấy rằng bạn đã trả lời tại dba.stackexchange.com/a/102284/18098 nhưng có ít nhất một lỗi đánh máy. Ngay cả sau khi tôi sửa "DEALLCOATE", tôi không thể chạy phiên bản Tất cả cơ sở dữ liệu của bạn. Tôi không quen thuộcSELECT @CountSQL\G
Ryan

6

Hãy thử truy vấn bên dưới với truy vấn động

SELECT Table_name AS TablesInDatabase ,table_rows AS NumberOfRows 
FROM information_schema.tables 
WHERE Table_schema=DATABASE(); 

1
Phương pháp này chỉ đáng tin cậy với cơ sở dữ liệu toàn MyISAM. InnoDB không lưu trữ số lượng hàng trong bất kỳ phần nào trong kiến ​​trúc của nó, cũng như trong Information_SCHema. (Xem bài viết của tôi dba.stackexchange.com/questions/17926/ săn ). Cách tiếp cận năng động chống lại Information_SCHema là cách duy nhất cho các bảng InnoDB.
RolandoMySQLDBA

Cảm ơn bạn đã chia sẻ phương pháp này. Tôi có thể xác nhận rằng phương pháp này mang lại số lượng hơi khác nhau cho một số bảng của tôi. Tất cả các bảng của tôi được lưu trữ trong công cụ lưu trữ InnoDB.
sjdh

Câu trả lời tốt nhất, hoạt động như quyến rũ.
Pablo Pazos

1

Có lẽ truy vấn này có thể giúp đỡ. Nó cho thấy kích thước dữ liệu và số lượng hồ sơ.

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;

1

Nhận số lượng hàng chính xác cho tất cả các bảng trong MySQL bằng cách sử dụng tập lệnh shell.

đặt tham số trong tệp tham số.config là

# Server Details
host_server=10.109.25.37

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

Tập lệnh cần tính là:

#!/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."

lưu tệp này trong tệp "mysqlrowscount.sh", Chạy tập lệnh này bằng lệnh:

bash mysqlrowscount.sh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.