【Mysql】テーブルの件数を取得する際に TABLE_ROWS と COUNT の違いの注意点
テーブルのデータ量が多く、COUNT だと時間が掛かるため、INFORMATION_SCHEMATABLES.TABLE_ROWS から件数を確認してみたのですが、これが実際の件数と違うので注意が必要です。
現象
information_schema.table_rows の値と count した件数が違う。
information_schema.table_rows から行数を取得。
| |
| table_name | table_rows |
|---|---|
| tbl_name | 12345 |
select count(*) から行数を取得。
| |
| table_name | COUNT(*) |
|---|---|
| tbl_name | 12999 |
上記のように table_rows と count で違いが生じます。
原因
table_rows と count の差異の原因は以下のためです。
TABLE_ROWS
行数。 MyISAM などの一部のストレージエンジンは、正確な数を格納します。 InnoDB などのほかのストレージエンジンの場合、この値は概算であり、実際の値と 40% から 50% まで異なる可能性があります。 このような場合、正確な数を取得するには SELECT COUNT(*) を使用します。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 26.38 INFORMATION_SCHEMA TABLES テーブル
対処
対処方法としては最適化です。
以下いずれかの対処で table_rows が正確なものになることを確認しました。
INDEXの最適化
読み取りロックが発生します。
| |
テーブルの最適化
どちらかを実行するだけでテーブルの最適化が行われます。
テーブルロックが発生するので注意してください。
| |
| |
自動的に最適化されるタイミング
漢(オトコ)のコンピュータ道: 大人のためのInnoDBテーブルとの正しい付き合い方。
- 前回インデックス統計情報を更新してから、テーブルの行数全体の1/16が更新された。
- 前回インデックス統計情報を更新してから、20億行以上更新された。
auto_increment を利用する方法
別の手として該当のテーブルに auto_increment が設定されている場合且つ物理削除を行われていないのであれば、auto_increment を取得すれば現在の行数として扱えるかと思います。
| |
※ auto_increment は 1 から始まるので -1 する。
| table_name | auto_increment-1 |
|---|---|
| tbl_name | 13210 |