Получить количество записей для всех таблиц в базе данных MySQL - PullRequest
298 голосов
/ 13 ноября 2008

Есть ли способ получить количество строк во всех таблицах в базе данных MySQL без запуска SELECT count() для каждой таблицы?

Ответы [ 16 ]

1 голос
/ 18 марта 2014

Это то, что я делаю, чтобы получить фактический счет (без использования схемы)

Это медленнее, но точнее.

Это двухэтапный процесс на

  1. Получить список таблиц для вашей базы данных. Вы можете получить его, используя

    mysql -uroot -p mydb -e "show tables"
    
  2. Создание и назначение списка таблиц переменной массива в этом скрипте bash (разделенных одним пробелом, как в коде ниже)

    array=( table1 table2 table3 )
    
    for i in "${array[@]}"
    do
        echo $i
        mysql -uroot mydb -e "select count(*) from $i"
    done
    
  3. Запустите его:

    chmod +x script.sh; ./script.sh
    
1 голос
/ 04 августа 2012

Следующий запрос создает (другой) запрос, который будет получать значение count (*) для каждой таблицы, из каждой схемы, указанной в information_schema.tables. Весь результат показанного здесь запроса - все строки вместе взятые - содержат действительный оператор SQL, заканчивающийся точкой с запятой - без висящего «объединения». Оборванное объединение можно избежать путем использования объединения в следующем запросе.

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);';
0 голосов
/ 31 марта 2015

Если вы знаете количество таблиц и их имена и предполагаете, что у каждой из них есть первичные ключи, вы можете использовать перекрестное соединение в комбинации с 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;

Вот пример SQL Fiddle .

0 голосов
/ 19 августа 2014

Постер хотел подсчитать количество строк без подсчета, но не указал, какой движок таблицы. С 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"
}

Я не делаю никаких утверждений по этому поводу, кроме того, что это действительно уродливый, но эффективный способ узнать, сколько строк существует в каждой таблице в базе данных, независимо от механизма таблиц и без необходимости установки хранимых процедур и необходимо установить ruby ​​или php. Да, это ржаво. Да, это имеет значение. количество (*) является точным.

0 голосов
/ 04 апреля 2012

Вот как я считаю ТАБЛИЦЫ и ВСЕ ЗАПИСИ, используя 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.";
0 голосов
/ 17 ноября 2011

Если вы хотите точные цифры, используйте следующий скрипт ruby. Вам нужны Ruby и RubyGems.

Установите следующие самоцветы:

$> 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.
...