tablo adını göster + mysql innodb veritabanındaki her tablo için kayıt sayısı


10

Geçerli veritabanındaki tüm tabloları, tablodaki satır sayısını birlikte listeleme.

Başka bir deyişle, mysql'de böyle bir şey bulmak için bir sorgu düşünebilir misiniz?

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

Farklı yaklaşımlar açıktır.


MyISAM veya InnoDB mi kullanıyorsunuz? Bu soruya baktın mı ?
Aaron Bertrand

@AaronBertrand Teşekkürler, bu soru karışıyor. Ben innodb kullanıyorum
sjdh

Yanıtlar:


8

Kaba kuvvet Dinamik SQL kullanarak çok agresif bir yaklaşım var

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;

Örnek: Test veritabanımda bunu alıyorum

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>

BİR ŞANS VER !!!

CAVEAT: Tüm tablolar MyISAM ise, bu çok hızlı olacaktır. Tüm tablolar InnoDB ise, her tablo sayılır. Bu çok büyük InnoDB tabloları için acımasız ve acımasız olabilir.


Bu, dinamik SQL'in harika bir örneğidir. Teşekkürler!
sjdh

Ben yerine çalıştı FROM information_schema.tablestarafından FROM show tables. Bunun neden işe yaramadığını açıklayabilir misiniz?
sjdh

Vay be bu son derece yararlı !!
Tommy

Bunun tüm veritabanlarında yinelenen bir sürümünü görmek isterim. Çalışmayı denedim, SELECT DISTINCT table_schema FROM information_schema.tablesancak bu sonuçlarda çalışmak için sorgunuzu nasıl saracağımı anlayamadım. Cevabı bulursam
Ryan

Aslında zaten dba.stackexchange.com/a/102284/18098 adresinde cevap verdiğini buldum, ancak en az bir yazım hatası var. "DEALLCOATE" i düzelttikten sonra bile, Tüm Veritabanları sürümünüzü çalıştıramıyorum. BilmiyorumSELECT @CountSQL\G
Ryan

6

Dinamik sorgusu olmayan aşağıdaki sorguyu deneyin

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

1
Bu yöntem yalnızca all-MyISAM veritabanı ile güvenilirdir. InnoDB, satır sayılarını mimarisinin hiçbir bölümünde veya BİLGİ_SCHEMA'da depolamaz. ( Yazıma bakınız dba.stackexchange.com/questions/17926/… ). BİLGİ_SCHEMA'ya karşı dinamik yaklaşım InnoDB tabloları için tek yoldur.
RolandoMySQLDBA

Bu yöntemi paylaştığınız için teşekkür ederiz. Bu yöntemin bazı tablolarım için biraz farklı sayımlar verdiğini onaylayabilirim. Tüm tablolarım InnoDB depolama motorunda saklanır.
sjdh

en iyi cevap, cazibe gibi çalışır.
Pablo Pazos

1

Belki bu sorgu yardımcı olabilir. Veri boyutunu ve kayıt sayısını gösterir.

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

Kabuk betiğini kullanarak MySQL'deki Tüm Tablolar için tam Satır Sayımlarını alın.

parametre.config dosyasındaki parametreyi şu şekilde ayarla:

# Server Details
host_server=10.109.25.37

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

Sayılacak komut dosyası:

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

bunu "mysqlrowscount.sh" dosyasına kaydet, Şu komutu kullanarak bu komut dosyasını çalıştır:

bash mysqlrowscount.sh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.