복붙노트

[SQL] MySQL 데이터베이스의 모든 테이블에 대한 기록 수를 가져옵니다

SQL

MySQL 데이터베이스의 모든 테이블에 대한 기록 수를 가져옵니다

각 테이블에 SELECT COUNT ()를 실행하지 않고 MySQL 데이터베이스의 모든 테이블의 행 수를 얻을 수있는 방법이 있나요?

해결법

  1. ==============================

    1.

    SELECT SUM(TABLE_ROWS) 
         FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_SCHEMA = '{your_db}';
    

    워드 프로세서 생각에서 참고 : InnoDB 테이블의 경우는, 행 수는 SQL 최적화에 사용되는 대략적인 예상이다. 당신은 (더 비싼이다) 정확한 계산을 위해 사용 COUNT (*)로해야합니다.

  2. ==============================

    2.당신은 아마 테이블 테이블과 함께 뭔가를 넣을 수 있습니다. 나는 그것을 해본 적이 없다, 그러나 테이블 이름에 대한 TABLE_ROWS에 대한 열 하나가있는 것 같습니다.

    당신은 아마 테이블 테이블과 함께 뭔가를 넣을 수 있습니다. 나는 그것을 해본 적이 없다, 그러나 테이블 이름에 대한 TABLE_ROWS에 대한 열 하나가있는 것 같습니다.

    테이블 당 행을 얻으려면, 당신은이 같은 쿼리를 사용할 수 있습니다 :

    SELECT table_name, table_rows
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = '**YOUR SCHEMA**';
    
  3. ==============================

    3.@Venkatramanan 다른 사람들과 마찬가지로 나는 다른 행 카운트를 내가 심지어 중지 된 테이블에서 실행마다 제공 (이노, MySQL은 5.1.44을 사용) 신뢰할 수없는 INFORMATION_SCHEMA.TABLES을 발견했다. 다음은 새 쿼리에 붙여 넣을 수있는 큰 SQL 문을 생성하는 상대적으로 해키 (그러나 유연한 / 적응) 방법은 루비 보석과 물건을 설치하지 않고 있습니다.

    @Venkatramanan 다른 사람들과 마찬가지로 나는 다른 행 카운트를 내가 심지어 중지 된 테이블에서 실행마다 제공 (이노, MySQL은 5.1.44을 사용) 신뢰할 수없는 INFORMATION_SCHEMA.TABLES을 발견했다. 다음은 새 쿼리에 붙여 넣을 수있는 큰 SQL 문을 생성하는 상대적으로 해키 (그러나 유연한 / 적응) 방법은 루비 보석과 물건을 설치하지 않고 있습니다.

    SELECT CONCAT(
        'SELECT "', 
        table_name, 
        '" AS table_name, COUNT(*) AS exact_row_count FROM `', 
        table_schema,
        '`.`',
        table_name, 
        '` UNION '
    ) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE table_schema = '**my_schema**';
    

    그것은 다음과 같은 출력을 생성합니다 :

    SELECT "func" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.func UNION                         
    SELECT "general_log" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.general_log UNION           
    SELECT "help_category" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_category UNION       
    SELECT "help_keyword" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_keyword UNION         
    SELECT "help_relation" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_relation UNION       
    SELECT "help_topic" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_topic UNION             
    SELECT "host" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.host UNION                         
    SELECT "ndb_binlog_index" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.ndb_binlog_index UNION 
    

    복사 마지막 UNION 같은 좋은 결과를 얻을 제외하고 붙여 넣기,

    +------------------+-----------------+
    | table_name       | exact_row_count |
    +------------------+-----------------+
    | func             |               0 |
    | general_log      |               0 |
    | help_category    |              37 |
    | help_keyword     |             450 |
    | help_relation    |             990 |
    | help_topic       |             504 |
    | host             |               0 |
    | ndb_binlog_index |               0 |
    +------------------+-----------------+
    8 rows in set (0.01 sec)
    
  4. ==============================

    4.난 그냥 실행

    난 그냥 실행

    show table status;
    

    이것은마다 테이블의 행 수를 더한 기타 정보의 무리를 줄 것이다. 나는 위의 선택한 답변을 사용하는 데 사용하지만,이 훨씬 쉽습니다.

    모든 버전이 작품,하지만 난 이노 엔진 5.5를 사용하고 있는지 확실하지 않습니다.

  5. ==============================

    5.

     SELECT TABLE_NAME,SUM(TABLE_ROWS) 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_SCHEMA = 'your_db' 
     GROUP BY TABLE_NAME;
    

    즉 당신이 필요로하는 모든입니다.

  6. ==============================

    6.이것은 카운트 기록을 프로 시저 목록 테이블을 저장하고, 마지막에 레코드 수를 생성합니다.

    이것은 카운트 기록을 프로 시저 목록 테이블을 저장하고, 마지막에 레코드 수를 생성합니다.

    이 절차를 추가 한 후이를 실행하려면 :

    CALL `COUNT_ALL_RECORDS_BY_TABLE` ();
    

    -

    절차:

    DELIMITER $$
    
    CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `COUNT_ALL_RECORDS_BY_TABLE`()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE TNAME CHAR(255);
    
    DECLARE table_names CURSOR for 
        SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    OPEN table_names;   
    
    DROP TABLE IF EXISTS TCOUNTS;
    CREATE TEMPORARY TABLE TCOUNTS 
      (
        TABLE_NAME CHAR(255),
        RECORD_COUNT INT
      ) ENGINE = MEMORY; 
    
    
    WHILE done = 0 DO
    
      FETCH NEXT FROM table_names INTO TNAME;
    
       IF done = 0 THEN
        SET @SQL_TXT = CONCAT("INSERT INTO TCOUNTS(SELECT '" , TNAME  , "' AS TABLE_NAME, COUNT(*) AS RECORD_COUNT FROM ", TNAME, ")");
    
        PREPARE stmt_name FROM @SQL_TXT;
        EXECUTE stmt_name;
        DEALLOCATE PREPARE stmt_name;  
      END IF;
    
    END WHILE;
    
    CLOSE table_names;
    
    SELECT * FROM TCOUNTS;
    
    SELECT SUM(RECORD_COUNT) AS TOTAL_DATABASE_RECORD_CT FROM TCOUNTS;
    
    END
    
  7. ==============================

    7.간단한 방법 :

    간단한 방법 :

    SELECT
      TABLE_NAME, SUM(TABLE_ROWS)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = '{Your_DB}'
    GROUP BY TABLE_NAME;
    

    예 결과 :

    +----------------+-----------------+
    | TABLE_NAME     | SUM(TABLE_ROWS) |
    +----------------+-----------------+
    | calls          |            7533 |
    | courses        |             179 |
    | course_modules |             298 |
    | departments    |              58 |
    | faculties      |             236 |
    | modules        |             169 |
    | searches       |           25423 |
    | sections       |             532 |
    | universities   |              57 |
    | users          |           10293 |
    +----------------+-----------------+
    
  8. ==============================

    8.이 작업을 시도 할 수 있습니다. 그것은 나를 위해 잘 작동합니다.

    이 작업을 시도 할 수 있습니다. 그것은 나를 위해 잘 작동합니다.

    SELECT IFNULL(table_schema,'Total') "Database",TableCount 
    FROM (SELECT COUNT(1) TableCount,table_schema 
          FROM information_schema.tables 
          WHERE table_schema NOT IN ('information_schema','mysql') 
          GROUP BY table_schema WITH ROLLUP) A;
    
  9. ==============================

    9.이 추정 문제에 대한 해킹 / 해결의 비트가 있습니다.

    이 추정 문제에 대한 해킹 / 해결의 비트가 있습니다.

    AUTO_INCREMENT - 어떤 이유로 데이터베이스에 대해이 반환 훨씬 더 정확한 행 개수는 자동 증가가 테이블에 설정 한 경우.

    테이블 표시 정보가 실제 데이터와 일치하지 않는 이유를 탐험 때 발견.

    SELECT
    table_schema 'Database',
    SUM(data_length + index_length) AS 'DBSize',
    SUM(TABLE_ROWS) AS DBRows,
    SUM(AUTO_INCREMENT) AS DBAutoIncCount
    FROM information_schema.tables
    GROUP BY table_schema;
    
    
    +--------------------+-----------+---------+----------------+
    | Database           | DBSize    | DBRows  | DBAutoIncCount |
    +--------------------+-----------+---------+----------------+
    | Core               |  35241984 |   76057 |           8341 |
    | information_schema |    163840 |    NULL |           NULL |
    | jspServ            |     49152 |      11 |            856 |
    | mysql              |   7069265 |   30023 |              1 |
    | net_snmp           |  47415296 |   95123 |            324 |
    | performance_schema |         0 | 1395326 |           NULL |
    | sys                |     16384 |       6 |           NULL |
    | WebCal             |    655360 |    2809 |           NULL |
    | WxObs              | 494256128 |  530533 |        3066752 |
    +--------------------+-----------+---------+----------------+
    9 rows in set (0.40 sec)
    

    그러면 쉽게 행 수에 대한 "최적 추정치"를 제공하기 위해이 데이터 열의 최대을 반환하는 PHP 또는 무엇이든을 사용할 수 있습니다.

    SELECT
    table_schema 'Database',
    SUM(data_length + index_length) AS 'DBSize',
    GREATEST(SUM(TABLE_ROWS), SUM(AUTO_INCREMENT)) AS DBRows
    FROM information_schema.tables
    GROUP BY table_schema;
    

    자동 증가는 항상 +1 * (테이블 수)하지만, 심지어 99.9 % 정확 4,000 테이블과 300 만 행과 오프 행이 될 것입니다. 예상 행보다 훨씬 더.

    이것의 아름다움은 가장 큰이 널 (null) 작업을하지 않기 때문에 performance_schema에 반환 된 행 카운트가뿐만 아니라, 당신을 위해 삭제하는 것입니다. 당신이 자동 증가와 아무 테이블이없는 경우, 그래도 문제가 될 수 있습니다.

  10. ==============================

    10.데이터베이스의 INFORMATION_SCHEMA를 사용하는 경우, 당신은이 MySQL의 코드를 사용할 수 있습니다 (일부 쿼리 행에 대해 널 (null) 값이 테이블을 표시하지 만드는 곳) :

    데이터베이스의 INFORMATION_SCHEMA를 사용하는 경우, 당신은이 MySQL의 코드를 사용할 수 있습니다 (일부 쿼리 행에 대해 널 (null) 값이 테이블을 표시하지 만드는 곳) :

    SELECT TABLE_NAME, TABLE_ROWS
    FROM `TABLES`
    WHERE `TABLE_ROWS` >=0
    
  11. ==============================

    11.다음 쿼리는 INFORMATION_SCHEMA.TABLES에 나열된 모든 스키마에서 모든 테이블의 COUNT (*)의 값을 얻을 것이다 (같아) 쿼리를 생성합니다. 함께 모든 행 - - 여기에 표시된 쿼리의 전체 결과없이 매달려 '노동 조합'- 세미콜론으로 끝나는 유효한 SQL 문을 포함한다. 매달려있는 노동 조합은 아래의 쿼리에서 노동 조합의 사용에 의해 피할 수있다.

    다음 쿼리는 INFORMATION_SCHEMA.TABLES에 나열된 모든 스키마에서 모든 테이블의 COUNT (*)의 값을 얻을 것이다 (같아) 쿼리를 생성합니다. 함께 모든 행 - - 여기에 표시된 쿼리의 전체 결과없이 매달려 '노동 조합'- 세미콜론으로 끝나는 유효한 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);';
    
  12. ==============================

    12.이것은 내가 (어떤 스키마를 사용하여) 실제 수를 얻을 위해 할 것입니다

    이것은 내가 (어떤 스키마를 사용하여) 실제 수를 얻을 위해 할 것입니다

    그것은 느리지 만 더 정확합니다.

    이 두 단계 과정에서의

  13. ==============================

    13.또 하나의 옵션 (가 빠릅니다로) 비 이노 것이 이노를 들어, INFORMATION_SCHEMA.TABLES에서 데이터를 사용합니다 - SELECT COUNT (*)가 정확한 수를 얻을 수 있습니다. 또한 그것은 의견을 무시합니다.

    또 하나의 옵션 (가 빠릅니다로) 비 이노 것이 이노를 들어, INFORMATION_SCHEMA.TABLES에서 데이터를 사용합니다 - SELECT COUNT (*)가 정확한 수를 얻을 수 있습니다. 또한 그것은 의견을 무시합니다.

    SET @table_schema = DATABASE();
    -- or SET @table_schema = 'my_db_name';
    
    SET GROUP_CONCAT_MAX_LEN=131072;
    SET @selects = NULL;
    
    SELECT GROUP_CONCAT(
            'SELECT "', table_name,'" as TABLE_NAME, COUNT(*) as TABLE_ROWS FROM `', table_name, '`'
            SEPARATOR '\nUNION\n') INTO @selects
      FROM information_schema.TABLES
      WHERE TABLE_SCHEMA = @table_schema
            AND ENGINE = 'InnoDB'
            AND TABLE_TYPE = "BASE TABLE";
    
    SELECT CONCAT_WS('\nUNION\n',
      CONCAT('SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND ENGINE <> "InnoDB" AND TABLE_TYPE = "BASE TABLE"'),
      @selects) INTO @selects;
    
    PREPARE stmt FROM @selects;
    EXECUTE stmt USING @table_schema;
    DEALLOCATE PREPARE stmt;
    

    데이터베이스가 큰 InnoDB 테이블의 많은 경우 모든 행을 계산하는 것은 더 많은 시간이 걸릴 수 있습니다.

  14. ==============================

    14.이것은 내가 테이블 및 모든 레코드 사용하여 PHP를 계산하는 방법이다 :

    이것은 내가 테이블 및 모든 레코드 사용하여 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.";
    
  15. ==============================

    15.포스터는 계산하지 않고 행 수를 원하지만, 어떤 테이블 엔진을 지정하지 않았습니다. 이노으로, 나는 단지 계산하는 하나의 방법을 알고있다.

    포스터는 계산하지 않고 행 수를 원하지만, 어떤 테이블 엔진을 지정하지 않았습니다. 이노으로, 나는 단지 계산하는 하나의 방법을 알고있다.

    이것은 내가 내 감자를 선택하는 방법입니다 :

    # 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"
    }
    

    나는, 설치 할 필요없이이 테이블 엔진에 관계없이 데이터베이스의 각 테이블에 존재하는 행 수를 얻을 수있는 정말 추한하지만 효과적인 방법이라고 이상의 저장 프로 시저를 설치할 수있는 권한이 필요없이이 기타에 대한 아무런 주장을하지 있어요 루비 또는 PHP. 예, 그 녹슨. 네, 그것은 계산합니다. (*) 정확한 계산.

  16. ==============================

    16.를 기반으로하지만, 출력을 정렬하는 "최종 조합을 제거"로하고, 옵션 필요없이 위의 나단의 대답 @, 나는 다음과 같은 SQL을 사용합니다. 그런 다음 바로 실행 다른 SQL 문을 생성합니다 :

    를 기반으로하지만, 출력을 정렬하는 "최종 조합을 제거"로하고, 옵션 필요없이 위의 나단의 대답 @, 나는 다음과 같은 SQL을 사용합니다. 그런 다음 바로 실행 다른 SQL 문을 생성합니다 :

    select CONCAT( 'select * from (\n', group_concat( single_select SEPARATOR ' UNION\n'), '\n ) Q order by Q.exact_row_count desc') as sql_query
    from (
        SELECT CONCAT(
            'SELECT "', 
            table_name, 
            '" AS table_name, COUNT(1) AS exact_row_count
            FROM `', 
            table_schema,
            '`.`',
            table_name, 
            '`'
        ) as single_select
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE table_schema = 'YOUR_SCHEMA_NAME'
          and table_type = 'BASE TABLE'
    ) Q 
    

    당신은 group_concat_max_len 서버 변수의 충분히 큰 값을 필요합니까하지만 MariaDb 10.2.4에서는 1M 기본합니다.

  17. ==============================

    17.당신이 정확한 숫자를 원하는 경우, 다음 루비 스크립트를 사용합니다. 당신은 루비와 루비 젬이 필요합니다.

    당신이 정확한 숫자를 원하는 경우, 다음 루비 스크립트를 사용합니다. 당신은 루비와 루비 젬이 필요합니다.

    다음 보석을 설치합니다 :

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

    18.당신은 테이블과 이름의 수를 알고, 가정하면 그들은 각각 각 테이블에서 오는 행을 얻기 위해 십자가 COUNT (별개의 [열])와 함께 참여 사용할 수있는 기본 키를 가지고 :

    당신은 테이블과 이름의 수를 알고, 가정하면 그들은 각각 각 테이블에서 오는 행을 얻기 위해 십자가 COUNT (별개의 [열])와 함께 참여 사용할 수있는 기본 키를 가지고 :

    SELECT 
       COUNT(distinct t1.id) + 
       COUNT(distinct t2.id) + 
       COUNT(distinct t3.id) AS totalRows
    FROM firstTable t1, secondTable t2, thirdTable t3;
    

    여기에 SQL 바이올린의 예입니다.

  19. from https://stackoverflow.com/questions/286039/get-record-counts-for-all-tables-in-mysql-database by cc-by-sa and MIT license