このすみエンジニアブログスマートフォン用の表示で見るこのすみエンジニアブログ2020-01-27MySQLのINFORMATION_SCHEMA.TABLESにおけるテーブルの行数(レコード数)は、概算値だから正確とは限らないテクノロジーSQLのパフォーマンスをテストするために、試験用にテーブルを作って大量のレコードを入れました。その時に試験をやり直そうと思い、テーブルをリセットする局面があったのですが。テーブル名」の違いを検証していました。その際にテーブルの集計で、「INFORMATION_SCHEMA.TABLES」で正しい値が取得できなかったので、そのことについて書きます。今回は試験用なので、簡易的にdockerで立ち上げたMySQLを利用します。GPL...お手軽にMySQLのコンテナーを立ち上げたいなら、@astrsk_horiさんの「dockerでmysqlを使う」が参考になります。INDEX(status));適当なシェルを作成して、テストデータを大量に入れます。私はローカルにMySQLクライアントを入れてなかったので、dockerのMySQLコンテナー内でシェルを実行しました。パスワードをインラインで記述するべきではないという警告が出力されたますが、今回は試験用のため無視します。mysql`doneシェルの実行後にテーブルを確認したところ、確かに10028件のレコードが挿入されました。sec)テーブル情報の確認@ikenjiさんの「MySQLでDBとテーブルのサイズを確認するSQL」が参考になります。「INFORMATION_SCHEMA.TABLES」を参照すれば、テーブルの情報が確認できます。sec)SQLの実行結果を確認するとわかりますが、本来は10028件のはずが、10000件と表示されてしまっています。この結果は不安定なようで、さまざまなパターンで何回かやり直してみたところ、正確な場合もあれば不正確な場合もありました。InnoDBテーブルの場合、行カウントは概算を返却するらしい理由が知りたかったので、リファレンスを確認してみました。「InnoDBテーブルの場合、行カウントはSQL最適化で使用される単なる概算」と、書いてあります。最適化で使用される単なる概算です。テーブルがパーティション化されている場合も、これは当てはまります。正確な値ではないようです。ちなみに、本来ならMySQL8系のリファレンスを見たかったのですが。5.6までのリファレンスしか見つからなかったため、5.6系のリファレンスをもとに書いてます。さいごにINFORMATION_SCHEMA.TABLESが返すInnoDBテーブルの行数(レコード数)は、あくまで概算値です。テーブルの正確な行数(レコード数)が必要な場合は、素直にCOUNT()関数を使って行数を集計するのが良さそうです。はてなブログProWEB系エンジニア。ブログで趣味の映画・ゲーム・読書の感想を書いたり、技術系の知見を共有しています。技術書典7にサークル参加して、技術同人誌を頒布しました。BOOTHに電子版があります。(1)月別アーカイブスポンサーリンクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。