Active Record(Ruby on Rails)はいつテーブルの情報を取得してるのか?
id:taedium さんのBlog記事 id:taedium:20070926:p1 をみて、 Active Record はいつテーブルの情報を取得してるのかを調べてみました。
開発環境(RAILS_ENV=development)
これはconsoleに出てるログを見ると直ぐ判ります。DBアクセス毎に SHOW FIELDS FROM テーブル を使って見てます。 テーブルの構造を変えたらサーバーの再起動無しで反映できると言うことです(もちろん、View/Controllerが対応出来るようなコードなら)。
Processing ArticleController#list (for 192.168.1.40 at 2007-09-27 09:44:10) [GET] Session ID: e0d489e8493faf1fa13d067fd7a16193 Parameters: {"action"=>"list", "controller"=>"article", "page"=>"2"} Article Columns (0.001644) SHOW FIELDS FROM articles SQL (0.001117) SELECT count(*) AS count_all FROM articles LEFT OUTER JOIN translations .. 省略 Article Load (0.000580) SELECT articles.id as id, articles.title, articles.link, articles.source, .. 省略 Rendering within layouts/article Rendering article/list Completed in 0.01886 (53 reqs/sec) | Rendering: 0.00623 (33%) | DB: 0.00597 (31%) | 200 OK .. 省略 Processing ArticleController#list (for 192.168.1.40 at 2007-09-27 09:44:27) [GET] Session ID: e0d489e8493faf1fa13d067fd7a16193 Parameters: {"action"=>"list", "controller"=>"article", "page"=>"1"} Article Columns (0.001858) SHOW FIELDS FROM articles SQL (0.000664) SELECT count(*) AS count_all FROM articles LEFT OUTER JOIN translations .. 省略 Article Load (0.000606) SELECT articles.id as id, articles.title, articles.link, articles.source, .. 省略 Rendering within layouts/article Rendering article/list Completed in 0.02685 (37 reqs/sec) | Rendering: 0.01309 (48%) | DB: 0.00585 (21%) | 200 OK
運用環境(RAILS_ENV=production)
運用環境では、SQLのログが出力されないので、mysqlのログを見てみる事にしました。
mysql でログに実行したSQL等を書かせるには mysqld_safe --log=ログファイル というオプションを付けて起動します。(mysqldは 通常 mysqlアカウントで動作してるので、ログを書くデイレクトリーのパーミッションには注意しましょう、最初ここでハマリました ^^;)
ログを見ると、最初にテーブルをアクセスした時だけ、SHOW FIELDS FROM テーブル を使っています。
070927 10:08:59 4 Connect tsuuji@localhost on tsuuji_dev 4 Query SET NAMES 'utf8' 4 Query SET SQL_AUTO_IS_NULL=0 4 Statistics 4 Query SHOW FIELDS FROM articles 4 Query SELECT count(*) AS count_all FROM articles LEFT OUTER .. 省略 4 Query SELECT articles.id as id, articles.title, articles.link .. 省略 .. 省略 070927 10:09:46 4 Statistics 4 Query SELECT count(*) AS count_all FROM articles LEFT OUTER .. 省略 4 Query SELECT articles.id as id, articles.title, articles.link .. 省略