2012年12月27日木曜日

mysqlのクエリを書くときに気を付けること

データベースの中で最新の日付を取得したい場合

select max(created_date) from XXXX;

とするよりも、

select created_date from XXXX order by id desc limit 0, 1;

としたほうが処理が軽くなる。

※id はauto_increment


件数が少ないうちは大差ないが、数百万のレコードがある場合にかなり違ってくる。


インデックスの貼り方にも気を付けたいところ。

2012年11月29日木曜日

VMとmailメソッド

【現象】
VM上からphpのmailメソッドでメールを送信することはできない。


らしいです。
詳しいことは、また今度調べます。

cakephpのsaveメソッド

【失敗】
saveメソッドを投げると、パラメータの設定されていないカラムはデフォルト値で更新される。

パラメータを設定しなければノータッチだと思っていたのが、間違いでした。

【例】

テーブル

+-----------------------+--------------+------+-----+---------+-------+
| Field                 | Type         | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| member_id             | int(7)       | NO   | PRI | 0       |       |
| point                 | int(7)       | YES  |     | 0       |       |
| created_date          | datetime     | YES  |     | NULL    |       |
| edited_date           | datetime     | YES  |     | NULL    |       |
| delete_flg            | int(1)       | YES  |     | 0       |       |
+-----------------------+--------------+------+-----+---------+-------+


ソース
$params['member_id'] = $member_id;
$params['created_date'] = $date;
$this->create();
$ret = $this->save($params);

ポイントが0で上書きされてしまう。
いくらポイント増やしてもすぐなくなるわけだよねー・・・。


【対策1】
$this->create();を実行した時点でデフォルトの値で更新されてしまうらしいので、
create()はINSERT文のときだけに書き、UPDATE文のときは書かない。

【対策2】
第3引数を使って、更新範囲を限定する。(?)

【対策3】
http://d.hatena.ne.jp/cakephper/20091221/1261385134 の追記2を参考に、今度調べる。。