แสดงชื่อตาราง + จำนวนเรคคอร์ดสำหรับแต่ละตารางในฐานข้อมูล mysql innodb


10

วิธีแสดงรายการตารางทั้งหมดในฐานข้อมูลปัจจุบันพร้อมกับจำนวนแถวของตาราง

กล่าวอีกนัยหนึ่งคุณสามารถคิดถึงคำถามที่จะเกิดขึ้นกับสิ่งนี้ใน mysql หรือไม่?

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

วิธีการที่แตกต่างยินดีต้อนรับ


คุณใช้ MyISAM หรือ InnoDB หรือไม่? คุณดูคำถามนี้หรือไม่
Aaron Bertrand

@AaronBertrand ขอบคุณคำถามนั้นกำลังรบกวน ฉันใช้
Innodb

คำตอบ:


8

ฉันมีวิธีการก้าวร้าวมากโดยใช้กำลังพลวัต 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;

ตัวอย่าง: ในฐานข้อมูลทดสอบของฉันฉันได้รับสิ่งนี้

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>

ให้มันลอง !!!

ถ้ำ: ถ้าตารางทั้งหมดเป็น MyISAM สิ่งนี้จะเกิดขึ้นเร็วมาก หากตารางทั้งหมดเป็น InnoDB แต่ละตารางจะถูกนับ นี่อาจเป็นเรื่องที่โหดร้ายและไม่ยอมทำตามสำหรับตาราง InnoDB ที่มีขนาดใหญ่มาก


นี่เป็นตัวอย่างที่ยอดเยี่ยมของ SQL แบบไดนามิก ขอบคุณ!
sjdh

ฉันพยายามที่จะเข้ามาแทนที่โดยFROM information_schema.tables FROM show tablesคุณช่วยอธิบายได้ไหมว่าทำไมถึงไม่ได้ผล?
sjdh

ว้าวนี่มีประโยชน์มาก !!
Tommy

ฉันชอบที่จะเห็นเวอร์ชันของสิ่งนี้ที่วนซ้ำในฐานข้อมูลทั้งหมด ฉันพยายามเรียกใช้SELECT DISTINCT table_schema FROM information_schema.tablesแต่ไม่สามารถหาวิธีห่อแบบสอบถามของคุณให้ทำงานข้ามผลลัพธ์เหล่านั้นได้ ถ้าฉันได้คำตอบฉันจะโพสต์ที่dba.stackexchange.com/q/201880/18098
Ryan

ที่จริงฉันพบว่าคุณตอบไปแล้วที่dba.stackexchange.com/a/102284/18098แต่มีอย่างน้อยหนึ่งตัวพิมพ์ผิด แม้หลังจากที่ฉันแก้ไข "DEALLCOATE" ฉันไม่สามารถเรียกใช้เวอร์ชันฐานข้อมูลทั้งหมดของคุณได้ ฉันไม่คุ้นเคยกับSELECT @CountSQL\G
Ryan

6

ลองค้นหาด้านล่างโดยไม่ต้องสืบค้นแบบไดนามิก

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

1
วิธีนี้มีความน่าเชื่อถือกับฐานข้อมูล all-MyISAM เท่านั้น InnoDB จะไม่เก็บจำนวนแถวในส่วนใดส่วนหนึ่งของสถาปัตยกรรมหรือใน Information_SCHEMA (ดูโพสต์ของฉันdba.stackexchange.com/questions/17926/… ) วิธีการแบบไดนามิกกับ INFORMATION_SCHEMA เป็นวิธีเดียวสำหรับตาราง InnoDB
RolandoMySQLDBA

ขอบคุณสำหรับการแบ่งปันวิธีนี้ ฉันสามารถยืนยันได้ว่าวิธีนี้ให้นับแตกต่างกันเล็กน้อยสำหรับบางตารางของฉัน ตารางทั้งหมดของฉันถูกเก็บไว้ในเอ็นจิ้นการจัดเก็บ InnoDB
sjdh

คำตอบที่ดีที่สุดทำงานเหมือนมีเสน่ห์
Pablo Pazos

1

บางทีแบบสอบถามนี้อาจช่วยได้ มันแสดงขนาดข้อมูลและจำนวนบันทึก

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

รับจำนวนแถวที่แน่นอนสำหรับตารางทั้งหมดใน MySQL โดยใช้เชลล์สคริปต์

ตั้งค่าพารามิเตอร์ในไฟล์ parameter.config เป็น

# Server Details
host_server=10.109.25.37

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

สคริปต์ที่จะนับคือ:

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

บันทึกสิ่งนี้ในไฟล์ "mysqlrowscount.sh", เรียกใช้สคริปต์นี้โดยใช้คำสั่ง:

bash mysqlrowscount.sh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.