system
篠﨑 亮洋

2021.2.10システム開発 

システムエンジニア

篠﨑 亮洋

MySQLでテーブル毎のレコード件数を取得する際の注意点

こんにちは。
今回は表題の件についての情報共有となります。

先日データベースの移行を行った際に、簡単にレコード件数確認できる方法あるかな?と思い
「MySQL テーブル毎 レコード件数」で検索を行い、下記SQLを使用したレコード件数取得の方法を見つけました。

select table_name, table_rows
from information_schema.tables
where table_schema = 'sample_db'

早速、実行してレコード件数を確認。
SQL実行結果

まとめて件数も確認できてこれは便利!と思ったのですが
テーブル毎にデータを確認している際に、上記で抽出された件数と実際の件数が異なることに気が付きました。
おかしいと思いつつ、念の為もう一度レコード件数を取得してみると
今度は初回と2回目の実行結果でレコード件数が異なっていました。
(もちろん、この間にレコードの追加・削除は行っていません。)

ということで、調べてみた結果がこちらとなります。

TABLE_ROWS
(MySQL公式サイトより引用)
https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html

簡単にまとめると、以下のような内容となります。

MyISAMの場合は正確な値、InnoDBの場合は概算値を返します。(40% ~ 50%の誤差あり)
正確な件数を取得する場合はSELECT COUNT(*)を使用してください。

不具合ではなく、MySQLの仕様で概算値が返されていた結果
データ件数が実際の値と異なっていたり、毎回の抽出結果が変動していたというわけですね。

残念ながら、information_schema.tableを参照するやり方は今後使用することは無さそうです。
(概算値で確認OKにはできないので。。。)
公式に書いてある通り、正確な件数を取得する際はテーブル毎にSELECT COUNT(*)使って件数を取得しましょう!

現役ウェブ解析士が教えるWebサイトの読み解き方 イメージ
システム開発サービスはこちら
ページTOPへ