MySQL全テーブル一覧と件数確認方法|実用的なクエリ集で効率的管理

データベース・SQL

「このデータベースにはどんなテーブルがあるの?」
「各テーブルにはどのくらいデータが入っているの?」
「データ容量はどのくらい?」

データベースを管理していると、こうした疑問が頻繁に出てきます。

特に、複数の人が関わるプロジェクトや、長期間運用しているシステムでは、データベースの全体像を把握することがとても重要です。

この記事では、MySQLで全テーブルの一覧と件数を効率的に確認する方法を、実用的なクエリと一緒に、データベースが初心者の人でもわかるように解説していきます。

スポンサーリンク

information_schemaとは?

MySQLのメタデータベース

information_schemaは、MySQLが提供する特別なデータベースです。

ここには、データベース自体の情報(メタデータ)が格納されています。

格納されている情報の例:

  • データベースの一覧
  • テーブルの一覧と詳細情報
  • カラム(列)の定義
  • インデックスの情報
  • ユーザーの権限情報

なぜinformation_schemaを使うの?

メリット:

  • SQLだけで情報を取得できる
  • 複数のテーブルの情報を一度に取得可能
  • プログラムから自動化しやすい
  • データベースサーバーに標準で含まれている

説明: information_schemaを使うことで、普通のSQLクエリと同じように、データベースの構造情報を取得できます。

: 普通のテーブルからデータを取得するのと同じような感覚で、「どんなテーブルがあるか」「各テーブルの件数は何件か」といった情報を調べることができます。

基本的なテーブル一覧の取得

すべてのテーブルを表示

まずは、データベース内のすべてのテーブル名を確認してみましょう。

SELECT table_name AS テーブル名
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY table_name;

説明: この例では、指定したデータベース内のすべてのテーブル名を、アルファベット順で表示します。

: 実行結果は以下のようになります

テーブル名
----------
customers
orders
products
users

詳細情報も一緒に表示

テーブル名だけでなく、エンジンや作成日時も確認したい場合:

SELECT 
    table_name AS テーブル名,
    engine AS エンジン,
    table_collation AS 照合順序,
    create_time AS 作成日時
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY create_time DESC;

説明: テーブルの基本情報を一覧で確認できます。作成日時の新しい順で並んでいるので、最近作成されたテーブルがわかります。

テーブル一覧と推定件数を取得

基本的な件数表示

各テーブルのおおよその件数を確認する基本的な方法:

SELECT 
    table_name AS テーブル名,
    table_rows AS 推定件数
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY table_rows DESC;

説明: table_rowsには、各テーブルの推定行数が格納されています。件数の多い順に並べることで、どのテーブルに多くのデータが入っているかがすぐにわかります。

: 実行結果の例

テーブル名    | 推定件数
-------------|----------
orders       | 15420
customers    | 3250
products     | 850
categories   | 12

詳細な情報も一緒に表示

件数だけでなく、データサイズも一緒に確認したい場合:

SELECT 
    table_name AS テーブル名,
    table_rows AS 推定件数,
    ROUND(data_length / 1024 / 1024, 2) AS データサイズMB,
    ROUND(index_length / 1024 / 1024, 2) AS インデックスサイズMB,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS 合計サイズMB,
    engine AS エンジン
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY (data_length + index_length) DESC;

説明: このクエリでは、データサイズとインデックスサイズも表示し、容量の大きい順に並べています。

: 実行結果の例

テーブル名  | 推定件数 | データサイズMB | インデックスサイズMB | 合計サイズMB | エンジン
-----------|----------|----------------|---------------------|-------------|--------
orders     | 15420    | 2.5            | 1.2                 | 3.7         | InnoDB
customers  | 3250     | 0.8            | 0.3                 | 1.1         | InnoDB
products   | 850      | 0.2            | 0.1                 | 0.3         | InnoDB

正確な件数を取得する方法

table_rowsの制限事項

information_schema.tablestable_rows推定値です:

MyISAMエンジン: 正確な件数が表示される InnoDBエンジン: 推定値が表示される(実際の件数と異なる場合がある)

正確な件数取得用SQLの自動生成

正確な件数が必要な場合は、各テーブルに対してCOUNT(*)を実行する必要があります。以下のクエリで、必要なSQLを自動生成できます:

SELECT CONCAT(
    'SELECT ''', 
    table_name, 
    ''' AS テーブル名, COUNT(*) AS 正確な件数 FROM ', 
    table_name, 
    ';'
) AS 実行用SQL
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY table_name;

説明: このクエリを実行すると、各テーブルの正確な件数を取得するためのSQLが生成されます。

: 実行結果として以下のようなSQLが生成されます

実行用SQL
--------------------------------------------------
SELECT 'customers' AS テーブル名, COUNT(*) AS 正確な件数 FROM customers;
SELECT 'orders' AS テーブル名, COUNT(*) AS 正確な件数 FROM orders;
SELECT 'products' AS テーブル名, COUNT(*) AS 正確な件数 FROM products;

これらのSQLをコピーして個別に実行すれば、正確な件数がわかります。

プロシージャを使った自動化

より効率的に正確な件数を取得したい場合は、ストアドプロシージャを使用できます:

DELIMITER //

CREATE PROCEDURE GetAllTableCounts(IN db_name VARCHAR(255))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE table_name_var VARCHAR(255);
    DECLARE sql_text TEXT;
    
    -- カーソルの定義
    DECLARE table_cursor CURSOR FOR 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = db_name 
          AND table_type = 'BASE TABLE';
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    -- 結果格納用の一時テーブル作成
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_counts (
        table_name VARCHAR(255),
        exact_count BIGINT
    );
    
    OPEN table_cursor;
    
    table_loop: LOOP
        FETCH table_cursor INTO table_name_var;
        IF done THEN
            LEAVE table_loop;
        END IF;
        
        -- 動的SQLの実行
        SET @sql = CONCAT('INSERT INTO temp_counts SELECT ''', 
                         table_name_var, 
                         ''', COUNT(*) FROM ', 
                         table_name_var);
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
    END LOOP;
    
    CLOSE table_cursor;
    
    -- 結果の表示
    SELECT table_name AS テーブル名, exact_count AS 正確な件数 
    FROM temp_counts 
    ORDER BY exact_count DESC;
    
    DROP TEMPORARY TABLE temp_counts;
END //

DELIMITER ;

使用方法:

CALL GetAllTableCounts('your_database_name');

説明: このプロシージャを実行すると、指定したデータベース内のすべてのテーブルの正確な件数が自動で取得されます。

特定の条件でフィルタリング

件数が多いテーブルのみ表示

SELECT 
    table_name AS テーブル名,
    table_rows AS 推定件数,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS 合計サイズMB
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
  AND table_rows > 1000  -- 1000件以上のテーブルのみ
ORDER BY table_rows DESC;

特定の文字で始まるテーブルのみ

SELECT 
    table_name AS テーブル名,
    table_rows AS 推定件数
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
  AND table_name LIKE 'user%'  -- userで始まるテーブル
ORDER BY table_name;

最近作成されたテーブル

SELECT 
    table_name AS テーブル名,
    table_rows AS 推定件数,
    create_time AS 作成日時
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
  AND create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)  -- 30日以内
ORDER BY create_time DESC;

データベース全体の統計情報

すべてのテーブルの合計統計

SELECT 
    COUNT(*) AS テーブル数,
    SUM(table_rows) AS 全レコード数推定,
    ROUND(SUM(data_length) / 1024 / 1024, 2) AS 全データサイズMB,
    ROUND(SUM(index_length) / 1024 / 1024, 2) AS 全インデックスサイズMB,
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS データベース合計サイズMB
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE';

説明: データベース全体の概要をひと目で把握できる統計情報を表示します。

: 実行結果の例

テーブル数 | 全レコード数推定 | 全データサイズMB | 全インデックスサイズMB | データベース合計サイズMB
---------|-----------------|------------------|----------------------|------------------------
15       | 25387           | 12.5             | 5.8                  | 18.3

エンジン別の統計

SELECT 
    engine AS エンジン,
    COUNT(*) AS テーブル数,
    SUM(table_rows) AS レコード数推定,
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 合計サイズMB
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
GROUP BY engine
ORDER BY 合計サイズMB DESC;

定期的な監視とレポート作成

日次レポート用クエリ

データベースの成長を監視するためのレポート:

SELECT 
    DATE(NOW()) AS レポート日,
    table_name AS テーブル名,
    table_rows AS 推定件数,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS サイズMB,
    CASE 
        WHEN table_rows > 100000 THEN 'Large'
        WHEN table_rows > 10000 THEN 'Medium'
        WHEN table_rows > 1000 THEN 'Small'
        ELSE 'Tiny'
    END AS サイズ分類
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE'
ORDER BY table_rows DESC;

成長率の監視

テーブルサイズの変化を記録するためのテーブル作成:

CREATE TABLE table_size_history (
    record_date DATE,
    table_name VARCHAR(255),
    table_rows BIGINT,
    data_size_mb DECIMAL(10,2),
    total_size_mb DECIMAL(10,2),
    PRIMARY KEY (record_date, table_name)
);

データ記録用のクエリ:

INSERT INTO table_size_history
SELECT 
    CURDATE() AS record_date,
    table_name,
    table_rows,
    ROUND(data_length / 1024 / 1024, 2) AS data_size_mb,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_size_mb
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
  AND table_type = 'BASE TABLE';

GUIツールでの確認方法

phpMyAdminでの確認

手順:

  1. phpMyAdminにログイン
  2. 左側のデータベース一覧から対象のデータベースを選択
  3. テーブル一覧が表示され、右側に「レコード数」が表示される

メリット: 視覚的にわかりやすく、クリックだけで確認可能 注意点: InnoDBエンジンの場合は推定値が表示される

MySQL Workbenchでの確認

手順:

  1. MySQL Workbenchを起動してデータベースに接続
  2. 左側のスキーマツリーでデータベースを展開
  3. 「Tables」フォルダを展開すると、各テーブルが表示される
  4. テーブルを右クリックして「Table Inspector」を選択すると詳細情報が表示される

メリット: 詳細な統計情報やインデックス情報も確認可能 注意点: 大量のテーブルがある場合は表示に時間がかかる場合がある

HeidiSQLでの確認

手順:

  1. HeidiSQLでデータベースに接続
  2. 左側のツリーでデータベースを選択
  3. メインエリアの「データ」タブでテーブル一覧と件数が表示される

パフォーマンスの考慮事項

information_schemaクエリの最適化

効率的なクエリの書き方:

-- 効率的(特定のデータベースのみ)
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = 'specific_database';

-- 非効率的(すべてのデータベースをスキャン)
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_name LIKE '%user%';

大規模データベースでの注意点

推定値の活用:

  • 数百万件のデータがある場合、COUNT(*)は時間がかかる
  • 定期的な概要把握には推定値で十分
  • 正確な件数が必要な場合のみCOUNT(*)を使用

バッチ処理の活用:

-- 負荷の高い時間帯を避けて実行
SELECT COUNT(*) FROM large_table;

よくある問題と対処法

問題1: table_rowsが0になっている

原因: InnoDBエンジンで統計情報が更新されていない 対処法:

ANALYZE TABLE テーブル名;

問題2: information_schemaにアクセスできない

原因: 権限不足 対処法: データベース管理者に以下の権限付与を依頼

GRANT SELECT ON information_schema.* TO 'username'@'hostname';

問題3: VIEWも一緒に表示される

原因: table_typeの条件が不適切 対処法: table_type = 'BASE TABLE'を必ず指定

セキュリティの考慮事項

権限の管理

information_schemaへのアクセスは、データベースの構造情報を見ることができるため、適切な権限管理が必要です:

読み取り専用ユーザーの作成例:

CREATE USER 'report_user'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT ON information_schema.tables TO 'report_user'@'localhost';
GRANT SELECT ON specific_database.* TO 'report_user'@'localhost';

機密情報の考慮

テーブル名やデータベース名から機密情報が推測される可能性があるため、外部公開する際は注意が必要です。

まとめ

MySQLで全テーブルの一覧と件数を確認する方法は、用途に応じて使い分けることが重要です。

基本的な確認方法

  • information_schema.tablesを使った推定値の取得
  • COUNT(*)を使った正確な値の取得
  • 目的に応じて推定値と正確な値を使い分け

実用的な活用

  • データベース全体の概要把握
  • 定期的な成長監視
  • パフォーマンス分析の基礎データ収集

効率的な運用

  • GUIツールとSQLクエリの使い分け
  • 自動化スクリプトやプロシージャの活用
  • 適切な権限管理とセキュリティ対策

確認方法別まとめ表

方法精度速度用途
information_schema推定値高速概要把握、定期監視
COUNT(*)正確低速正確な分析が必要な場合
phpMyAdmin推定値高速視覚的確認、初心者向け
MySQL Workbench推定値中速詳細分析、開発者向け

コメント

タイトルとURLをコピーしました