全力で怠けたい

怠けるために全力を尽くしたいブログ。

MySQL のテーブルの概算の行数を INFORMATION_SCHEMA.TABLES から素早く取得する方法。

はじめに

MySQL のテーブルの概算の行数は INFORMATION_SCHEMA.TABLES テーブルから取得すると素早く取得できる。

RDBMS のテーブルの行数は SELECT COUNT(*) FROM <テーブル名> クエリで取得できるけど、テーブルのレコードが何十億レコードもあるなど非常に多いときはそれなりに時間がかかる。 MySQL はデータベースのメタデータを格納する INFORMATION_SCHEMA データベースがあって INFORMATION_SCHEMA データベース の TABLES テーブルから概算ではあるけどテーブルの行数を非常に素早く取得できる。

INFORMATION_SCHEMA.TABLES から行数を取得する方法

INFORMATION_SCHEMA.TABLES テーブルの TABLE_ROWS カラムがテーブルの行数。 TABLE_SCHEMA カラムと TABLE_NAME カラムとで行数を取得したいテーブルを絞り込める。

mysql> SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='<データベース名>' AND TABLE_NAME='<テーブル名>';

INFORMATION_SCHEMA.TABLES から行数を取得するときに気をつけること

INFORMATION_SCHEMA.TABLES テーブルの TABLE_ROWS カラムから取得できる行数は正確ではなく概算にすぎないことには気をつけておく。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 26.38 INFORMATION_SCHEMA TABLES テーブル

行数。 MyISAM などの一部のストレージエンジンは、正確な数を格納します。 InnoDB などのほかのストレージエンジンの場合、この値は概算であり、実際の値と 40% から 50% まで異なる可能性があります。 このような場合、正確な数を取得するには SELECT COUNT(*) を使用します。

TABLE_ROWS は、INFORMATION_SCHEMA テーブル用の NULL です。

nnoDB テーブルの場合、行カウントは SQL 最適化で使用される単なる概算です。 (InnoDB テーブルがパーティション化されている場合も、これは当てはまります。)

INFORMATION_SCHEMA.TABLES から行数を取得する例

実際に INFORMATION_SCHEMA.TABLES テーブルからテーブルの行数を取得してみる。

MySQLworld データベースの country テーブルの行数を取得していく。 country テーブルから SELECT COUNT(*) で取得する結果は 239 になって INFORMATION_SCHEMA.TABLES テーブルから取得する結果も 239 になっている (この例ではたまたま2つの方法で取得する行数が一致している)

mysql> source /path/to/world.sql;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT COUNT(*) FROM world.country;
+----------+
| count(*) |
+----------+
|      239 |
+----------+
1 row in set (0.01 sec)

mysql> SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='world' AND TABLE_NAME='country';
+------------+
| TABLE_ROWS |
+------------+
|        239 |
+------------+
1 row in set (0.00 sec)

参考サイト