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  .. 省略