最近パフォーマンス対策とかバグ修正とかして大分エラーメールが減ってきたんですが、全然なくならないのがこれ。

Lost connection to MySQL server during query

max_allowed_packetが足りないと出る場合があるとあったので倍に増やしてみても効果無し。なんだろなー。

スケーラブルWebサイト
  • スケーラブルWebサイト
  • オライリー・ジャパン(2006-12-26)
  • オライリー・ジャパン
  • (著)Cal Henderson
  • (翻訳)武舎 広幸
  • (翻訳)福地 太郎
  • (翻訳)武舎 るみ
  • 定価:¥ 3,570
  • 新品価格:¥ 3,570
  • 中古価格:¥ 2,825
  • ASIN:4873113113

Webサービスの開発プロセス全体についてまんべんなく書いてありました。それぞれのトピックスに関してはもっと濃い本を参照する必要があるけどプログラマでも別ジャンルだった人がWebを始めるときに読んだらかなり助かるんじゃないかなーと思いました。

特に、「早過ぎる最適化は悪」っていうのはホントに同意。パフォーマンスに問題が出たからつって、真っ先に、カーネルチューニングとかテーブル分割とかRAMディスクとか言い出すのは暇人か金持ち。(言い過ぎ)

実践ハイパフォーマンスMySQL
  • 実践ハイパフォーマンスMySQL
  • オライリージャパン(2004-10)
  • オライリージャパン
  • (著)ジェレミ・D. ザウドニ
  • (著)デレク・J. ベリング
  • (原著)Jeremy D. Zawodny
  • (原著)Derek J. Balling
  • (翻訳)林 秀幸
  • 定価:¥ 3,780
  • 新品価格:¥ 3,780
  • 中古価格:¥ 3,300
  • ASIN:4873112095

MySQLモデリングについてマルチカラムインデックスをちゃんと勉強しないといけないなあとおもったので(前に持ってたにもかかわらず)実践ハイパフォーマンスMySQLを注文しました。

1人(MAX3人)でWebサービスを作ることに焦点を合わせて考えると、パフォーマンスに関してもかなり効率的に(手っ取り早く)対処しないといけない。小~中規模Webアプリのボトルネックは圧倒的にDB、それもSQLとインデックスにかかってる気がする!(91%ぐらいの割合で)

それなのに、MySQLだとあんまり勘が利かないんですよね。ポスグレだと、EXPLAINの結果もインデックスの作用も大体予想通りだし、遅い部分があっても、「そうなるわな」って感じなのにMySQLだと「え?そこが?」みたいな。

別にポスグレで独自の難しい機能を使ってるとかじゃなくて、MySQLでは単に「1テーブル1インデックス問題」のせいじゃないんかと。もし勉強してみてマ(略)スをうまく使えば対応可能だったら安心だけど、そうじゃなかったら(非正規化が必要ということだったら)ポスグレ移行も考えたい。

Debian—Debian “etch” Release Information

Debian GNU/Linux 4.0 (a.k.a. etch) was released April 8th, 2007. The release included many major changes, described in our press release and the Release Notes.

To obtain and install Debian GNU/Linux 4.0, see the installation information page and the Installation Guide. To upgrade from an older Debian release, see the instructions in the Release Notes.

Debin etchが昨日リリースされたみたいです。

FirefoxがIceWeaselになったりThundrbirdがIceDoveになったりしてますが、この間デスクトップ環境を入れてみた感じはUbuntuじゃなくてもいいかもと思えるぐらい良さそうでした。

サーバー環境に関しては慣れの問題だとは思いますが、もう体が溶けるほど使い易しぃ・・・。ノンストレスです。依存症です。

それとDebian JP Projectのページが何か綺麗になっとる。Software Designに寄稿された武藤さんのインストールドキュメントなんかもあって非常に分かり易い。素晴らしい仕事!

最近衝撃を受けた小さいこと。

separated_password

Photoshopとかのこういうシリアル入れる欄。

1034-2321-4323-6518-6985-8733

これはこういうテキストをペーストすると一気に全部入る!!!

eringi blog: Pear/Net_Url_Mapper

今はたいていのフレームワークにURLをルーティングする機能が備わってるけど、その機能だけを抜き出したようなパッケージ。 やっつけで作ったオレオレフレームワークに組み込んだり、いまいち使い方が分からないEthnaのステキURLを代替できそう。

おお、Railsみたいに書けちゃうのかよ。

おれのもはや見たくもない大量のrewrite ruleゴッソリ減りそう。

p0t: 1テーブル1インデックス

オライリーの「実践ハイパフォーマンスMySQL」には

「MySQLでは、1つのクエリを実行する時、1つのテーブルにつき1つのインデックスしか使用できない」

と書いてあります。同じような内容を公式リファレンスマニュアルからは見つけられなかったんですが、実際に試して見る限りそのようです。他のRDBの感覚で言うと1テーブル1インデックスしか使われないのでは現実的な速度が出ない気がします。

この問題について。

何人かの人に聞いて回ったりしてるんですが、はっきりしたことはわかってません。

現状の俺の結論としてはこんな感じです。

  • MySQLモデリングは実在する!(他のDBより非正規化を早い段階で行う)
  • データモデリング手法の中には(この問題のせいで)MySQLでは機能しないものもある。
  • MySQLでは非正規化でパフォーマンスを上げる。

眠たいことを言ってもしょうがないので断言気味です。

元々、通常のプログラミングとDBでは(インデックスのせいで)パフォーマンスの良い設計っていうのが感覚的に結構違う気がします。MySQLの非正規化は(DBAに対して)プログラマ側の考え方で、自分の慣れた理論にもってけるので特に文句が出てないんじゃないのかと思いました。

オンメモリのテーブルとか、レプリケーションとかレベル2のテーブル分割とか、それって、「1テーブル1インデックス問題」のせいでいろいろやらなきゃいけなくなってんじゃないの?とか怪しんでます。

関連エントリー:

Plnetでサービスをカテゴリー分けできるようにしました。

sortable_service

サービスをドラッグしてカテゴリ分けします。

categories

何かいい見せ方がないか考え中です。

パフォーマンス改善を正しくやりたいとか言っておいて、Plnetがあまりに重く、使い物にならなくなっていたので焦ってまた勘で対応していまいました・・・。

lighter_graf.png

しかも効果がありまくりで・・・。

mysqlがslow-query出しまくりなのでページキャッシュを入れまくりました。Mojavi2なんでこういうSmartyプラグインを作った感じです。

<?php
if (!defined(CACHE_LITE_DIR)) define('CACHE_LITE_DIR', '/tmp/');
if (!defined(CACHE_LITE_AUTO_CLEANING)) define('CACHE_LITE_AUTO_CLEANING', 128);

function smarty_function_mojavi_action($params, &$smarty)
{
    $id = $params['module'].'_'.$params['action'];

    if (isset($params['lifetime'])) {
        include_once 'Cache/Lite.php';
        $cache =& new Cache_Lite(array(
            'cacheDir' => CACHE_LITE_DIR,
            'lifeTime' => $params['lifetime'],
            'automaticCleaningFactor' => CACHE_LITE_AUTO_CLEANING,
            'automaticSerialization' => true
        ));

        $cache_id = $id.'_'.
            (isset($params['cache_id']) ? $params['cache_id'] : '');
        if ($data = $cache->get($cache_id)) {
            return $data;
        }
    }

    $controller =& Controller::getInstance();
    $actionChain =& new ActionChain();
    $actionChain->register($id, $params['module'], $params['action']);
    $actionChain->execute($controller, $controller->request, $controller->user);
    $data = $actionChain->fetchResult($id);
    if (isset($params['lifetime'])) $cache->save($data, $cache_id);
    return $data;
}
?>

なんでDBが重いのにmysql serverがCPU食わないんだろう。clientの方ばっかり食ってることになってる。

とりあえずcocoitiさんにスケーラブルWebサイトを借りたので読んで悔い改めたいと思います。

スケーラブルWebサイト
  • スケーラブルWebサイト
  • オライリー・ジャパン(2006-12-26)
  • オライリー・ジャパン
  • (著)Cal Henderson
  • (翻訳)武舎 広幸
  • (翻訳)福地 太郎
  • (翻訳)武舎 るみ
  • 定価:¥ 3,570
  • 新品価格:¥ 3,570
  • 中古価格:¥ 2,913
  • ASIN:4873113113
吉田電車
  • 吉田電車
  • 講談社(2007-01-12)
  • 講談社
  • (著)吉田 戦車
  • 定価:¥ 540
  • 新品価格:¥ 540
  • 中古価格:¥ 243
  • ASIN:4062756315

筆者吉田のますますおっさんくさい、楽しみや全然グルメじゃない旨さがおかしい。仕事とはいえ一人で楽しげなところにいろいろ出かけて家族の者(大)や(小)は怒らないんだろうかと心配してしまいます。