LoginSignup
6
8

More than 5 years have passed since last update.

mysqlのinnodbのテーブルごとのレコード数を正確に出したい

Posted at

やりたいこと

mysql では大抵エンジンは innodb を使うと思いますが、、、
show table statusschema_infomation.tablesのtable_rows の件数が概算値となりブレてよくわからなくなる時があります。
特にレコードを大量に消した時やレコードを追加した時に正確な値が取れない。。。
なぜそうなるのか、、、調べきれていないけどとりあえず件数が知りたい。。。

解決策

必要な分だけカウントを取るワンライナーを書けばいいんだということに辿り着いた。
以下のようなSQLを書くとイケる!!!!

サクッとSQLで書くと以下のようになる。各テーブルごとのcountをとって出力する。

mysql> SELECT (SELECT count(*) FROM table1) AS table1, (SELECT count(*) FROM table2) AS table2\G
*************************** 1. row ***************************
                     table1: 28
                     table2: 233

上記のようにレコード数の知りたいテーブルに対して、 (SELECT count(*) FROM table1) AS table1 の部分をふやしていけばいいんですが、、
すべてのテーブルのレコード数を知りたいなど、単純に何個もコピペすることになり、増やすだけでめんどくさい。。。

ということで上記のデータを出すためのワンライナーを書きました。

Rubyのワンライナーでレコード数を取得

$ mysql -N -uroot DB名 -e "SHOW TABLES" | \
  ruby -nle 'BEGIN{$counts=[]}; $counts << "(SELECT COUNT(*) FROM #{$_}) AS #{$_}"; END{puts "SELECT " + $counts.join(",").concat("\\G")}' | \
  mysql -uroot DB名

  • 注意) mysqlコマンドのところは -p -h などのオプションを使って適切なアカウントやホスト情報を設定するのが環境によっては必要になります。

Rubyを使っていますが、いろんな言語 でも同様のことができそうですね!!
上記のRubyのものももっと最適化とかもできそうな感じもしますし。。
あまりワンライナーとか書かないのでこういう書き方もあるなどあれば教えてほしいです。

Gistにもコードを置いていますので、ご参考までに。
MySQLのテーブルカウント数を取得する。Rubyワンライナー - Github Gist

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8