つい最近気づいたことです。
- phpMyAdminで巨大テーブルを見る
- 例えば100万件とか1000万件とか
- その合計件数が実際よりも少ない
- ブラウザ上で一部レコードが表示されない
それはphpMyAdminの仕様に原因があります。
なるほどなと少し驚いたので、
合計件数が少なく表示される問題をまとめます。
このページの目次
100万件のレコードの合計件数が会わない
あるテーブルに100万件レコード挿入しました。
エラーなし、問題なく挿入できたみたいです。
ところがphpMyAdminで表示してみると…
▼ なんか表示件数が少なくない?
100万件ピッタリのINSERTを実行したにも関わらず、行数が997899件と表示されてます。最初見たときは「クエリの一部が失敗したのかな?」とか思っちゃいました。
そしてブラウザ上でレコードを確認。
最後までページングしても合計件数が合いません。
▼ このような感じになってた
これは巨大なテーブルで起こりがちな現象です。
理由はphpMyAdminは概算件数を表示するから
その理由はphpMyAdminの仕様にあります。
▼ 行数取得はこういう仕様になってる
3.11 InnoDB のテーブルの行数が正しくありません。
phpMyAdmin は簡潔な方法で行数を取得していますが、この方法では InnoDB テーブルの場合に概数しか返ってきません。この結果を修正する方法は $cfg['MaxExactCount'] を参照してください。ただし、これは性能に深刻な影響を与える可能性があります。もっとも、概算の行数をクリックすると、正確な行数に簡単に置き換えることができます。これは、最下部に表示されている行数の合計値をクリックすれば、すべてのテーブルを一度に更新できます。引用元 : https://docs.phpmyadmin.net/ja/latest/faq.html#the-number-of-rows-for-innodb-tables-is-not-correct
「概数しか返ってきません。」
もし合計件数をピッタリ求めようとしたら時間がかかりすぎます。phpMyAdminの表示性能を高めるために概算だけ表示してるみたいです。
上記の説明の通り、変更もできるみたい
正確な合計件数の確認するには…?
もし正しい合計件数を知りたいなら…
テーブル一覧の行をクリックするだけです。
▼ この部分をクリックすると…
▼ 本当の合計件数を表示してくれる
ちゃんと100万件と表示されてる。
あるいはクエリ実行でもOKですね。
▼ もっとも基礎的なクエリの1つ
1 2 3 4 5 6 7 |
SELECT COUNT(*) FROM `prime_numbers`; # ============ # | COUNT(*) | # ========== # | 1000000 | # ============ |
ただしい合計行数を表示する方法を知ってないと、過去の僕のように「あれ?クエリ実行がおかしい?」みたいに勘違いをしてしまいます。
この方法は知ってて損ありません
ちなみに $cfg['MaxExactCount'] の変更方法
もちろんphpMyAdminの設定変更もできます。
単純に $cfg['MaxExactCount'] の値を変えるだけです。
▼ この定数の概要
InnoDB テーブルにおいて、どの程度の大きさのテーブルまで SELECT COUNT で正確な行数を取得するかを指定します。SHOW TABLE STATUS によって返される概算の行数が設定した値より小さい場合は SELECT COUNT が使われますが、そうでない場合はこの概算数が使われます。バージョン 4.8.0 で変更: パフォーマンスの理由から、デフォルト値は 50000 に下げられました。
引用元 : https://docs.phpmyadmin.net/ja/latest/config.html#cfg_MaxExactCount
50万件が正確な行数取得できる上限です。
この値の変更方法、次のような手順です。
- config.inc.phpを開く
phpMyAdminのインストール先にconfig.inc.phpという設定ファイルが見つかるはず。ちなみにyumでインストールした場合の場所は /etc/phpMyAdmin/config.inc.php になる
- MaxExactCountの値を追加/変更
開いたら $cfg['MaxExactCount'] のある箇所を探して値変更。恐らくデフォルトだと見つからないので、その場合は以下のように新規追加する
12/// 正確な表示件数を200万件まで拡張$cfg['MaxExactCount'] = 2000000; - MySQLを再起動する
設定が反映されて合計件数が正確に表示される
このような手順で変更できます。
実際に50万件⇒200万件と拡張したら、100万レコードあっても最後のレコードまできっちり表示してくれました。ただパフォーマンスは若干落ちます。
以上、phpMyAdminで合計件数の問題でした。
少なく表示されるのは仕様です。