cakephperの日記(CakePHP, Laravel, PHP)


継続的WebセキュリティテストサービスVAddyを始めました!

2011-05-25

NewYork MongoDB Meetup 動画のサマリ

NYのMongoDB Meetupに参加した @yando さんが、Nateさんの発表動画を公開しています。ありがとうございます!Nateさんは元CakePHPリードデベロッパーで、現在はLithiumフレームワークのリードデベロッパーを務めています。


今回はそのサマリをざっと書いておきます。詳細は、下記の記事からyoutube動画へ行って見てください。英語は聞き取りやすいと思います。

http://tech.a-listers.jp/2011/05/24/how-not-to-code-the-mongodb-edition/

ニューヨークで行われたMongoDB Meetupの様子」


「How Not To Code」 by Nate Abele
===========サマリ=========================
groupクエリは遅くてロックがかかりやすい

ReplicatoinしてセカンダリからReadするなどの工夫
 Mongo::setSlaveOkayを使って
 http://jp2.php.net/manual/en/mongo.setslaveokay.php

MongoでAutoIncrement
 コレクション単位にカウントするドキュメントを作成。 チケットコレクションの例
   {_id: "users", seq:11 }
   {_id: "posts", seq:22 }

   該当コレクションに書き込む前に、チケットコレクションの該当レコードを $incしてカウントアップ。
   カウントアップした数値をAutoIncrement代わりに使う
   例えばusersコレクションにInsertする前に、チケットコレクションの_id:usersのseqを$incして値を取得。
   それをAutoIncrementの値としてusersコレクションの_idにセットしてInsert
   

コレクション内の_idにObjectIDタイプと、文字列タイプが入り乱れている場合
 ソートがうまくいかない(例:日付のソートをしたのに、ObjectIDと文字列IDがばらばらにソートされる)
 プログラムが直接MongoDBを操作して何も考えずに値を保存すると文字保存になる
  抽象レイヤーを使って文字列をObjectIDに自動変換する仕組みを通してこういった問題をさける


1ドキュメント16Mの制約を恐れるな!
 でも深い階層のフィールドを検索するのは遅くなりやすいから気をつけて


コレクションを分割する方法もあるよ
 Joinはアプリケーションレベルでやる
 FWのモデルレベルでできるものがいくつかある(Lithiumもその一つ)

Indexは重要、ちゃんと解析してIndex張ること。予想だけではだめ。
 BackgroundIndexでIndex生成する


動画では質問者の声が聞き取りにくいですが、Nateさんの声は鮮明だしプレゼン資料の文字も見えるので快適に視聴できました。Nateさんがちょっとした小話とか入れてるので聞いてるのも飽きなかったです。