「このデータベースにはどんなテーブルがあるの?」
「各テーブルにはどのくらいデータが入っているの?」
「データ容量はどのくらい?」
データベースを管理していると、こうした疑問が頻繁に出てきます。
特に、複数の人が関わるプロジェクトや、長期間運用しているシステムでは、データベースの全体像を把握することがとても重要です。
この記事では、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.tables
のtable_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での確認
手順:
- phpMyAdminにログイン
- 左側のデータベース一覧から対象のデータベースを選択
- テーブル一覧が表示され、右側に「レコード数」が表示される
メリット: 視覚的にわかりやすく、クリックだけで確認可能 注意点: InnoDBエンジンの場合は推定値が表示される
MySQL Workbenchでの確認
手順:
- MySQL Workbenchを起動してデータベースに接続
- 左側のスキーマツリーでデータベースを展開
- 「Tables」フォルダを展開すると、各テーブルが表示される
- テーブルを右クリックして「Table Inspector」を選択すると詳細情報が表示される
メリット: 詳細な統計情報やインデックス情報も確認可能 注意点: 大量のテーブルがある場合は表示に時間がかかる場合がある
HeidiSQLでの確認
手順:
- HeidiSQLでデータベースに接続
- 左側のツリーでデータベースを選択
- メインエリアの「データ」タブでテーブル一覧と件数が表示される
パフォーマンスの考慮事項
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 | 推定値 | 中速 | 詳細分析、開発者向け |
コメント