タグ: #MySQL
- クエリーキャッシュを効かせたいときはCURDATE()やNOW()を使わない
CURDATE()は便利ですが、これを使うとクエリーキャッシュが効かないので、場合によってはPHPで一行書いてから次のように使いましょう。
// 悪い例 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // 良い例 $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");LIMIT 1をうまく使う selectするときに該当するレコードが一つしかないとわかっているときは「LIMIT 1」を使いましょう。これを使っておけば、全体をスキャンすることがないので速くなりますよ。
order by rand()を避ける ランダムで一つのレコードを取ってくる時によく使う手ですが、RAND()はCPUパワーを使うのであまり使うべきではないとのこと。PHPでごにょごにょしてからやるのが良さそうです。
// 悪い例 $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1"); // 良い例 $r = mysql_query("SELECT count(*) FROM user"); $d = mysql_fetch_row($r); $rand = mt_rand(0,$d[0] - 1); $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");PROCEDURE ANALYSIS()を使おう! EXPLAINは知っていましたが、こちらは知りませんでしたよ…。PROCEDURE ANALYSIS()を使えば、格納されているデータを見て、最適な「型」を提案してくれるようです。VARCHARよりENUMが良い、とか教えてくれるっぽいですな。
バッチ処理に気をつけよう メンテナンス時などに膨大な数のレコードを削除したりするときは、一気にやるのではなくて、細かく分けた方が良さそうです。そうしないとWebサーバーに負荷をかけてしまうことも。以下のように処理すると良いですね。
while (1) { mysql_query("DELETE FROM logs WHERE log_date < = '2009-10-01' LIMIT 10000"); if (mysql_affected_rows() == 0) { // done deleting break; } // 必要ならsleepも。 usleep(50000); }他にも原文にはいろいろあるので、覗いてみるといいですね。当たり前の人には当たり前でしょうが、こうしたTipsはコツコツと身につけていきたいものです。
覚えておきたいMySQLのベストプラクティスまとめ… - IDEA*IDEA ~ 百式管理人のライフハックブログ
PROCEDURE ANALYSIS()は初耳だったので調べてみようと思います。
2年前 | 固定リンク | 2010年 5月 20日 | 
