やりたいこと
mysql では大抵エンジンは innodb を使うと思いますが、、、
show table status
や schema_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