« Joker Racer サービスの一時休止についての説明 | メイン | 大人な事情により Apple の審査通りませんでした(ツイキャス・ビュワー) »

2010年04月02日

Tokyo Tyrant 雑多なメモ (Tokyo Cabinet も可) あとで読む

合宿で Tokyo Tyrant 部分、いろいろチューニングしたのでメモ。細かいのでその手の方以外はスルーの方向で。

対象は便利すぎる Tokyo Tyrant Table。


・インデックス

 addCond()->addCond()->addCond()

で絞り込んでいくとき、hint() で調べると最後に追加した Query から順に Index を使っていることがわかる。(5/3追記)⇒最後ではなく、2番目、一番目、と使う様子。

なので最初は大雑把な絞り込み(カテゴリとか)を行い、最後に詳細な絞り込み(ユーザーID)なんかをかけた方がパフォーマンスがあがる様子(手元のベンチマークでは上がった)。


・数値インデックスに対する NUMGT や NUMGE

日付のタイムスタンプなどで、過去三日以内、というときに

addCond(日付のとこ, 数値が~より大きい, 3日前)

みたいな感じにすると思うけど、この Query かけた時点で候補がたくさん残っているとかなり遅い。
なぜか数値インデックスのこれだけ妙に遅い。ノーパソのVMWare上だけど10万件ソート1秒近くとか。できれば避けたい。(うーん、なんか間違ったのかなぁ・・そうかもしれない)


・プライマリーキーはフィールド指定して検索・ソートできる

特定の id の情報をとってくるのは

->get(id)

とかしてると思うが、これ、実は

query->addCond("", 数値が~に等しい, 検索したいID)

とかでも引っ張ってこれる。空文字はプライマリーキーを表す。
なので、ソートして検索したい場合、最後に追加したものが最新のデータ、という構成であれば、created みたいな日付フィールドつくってインデックスはってソートして、なんてしなくても

query->setOrder("", 数値が大きい順)

などとすればソートできる。これは数値インデックス別途張るよりもちょっと早い。(5/3追記: 速度は変わらないかひょっとすると遅くなっているかも。)


・最近の1万件を検索対象、とかを高速にする方法

追記式のデータの場合、直近の1万件を検索対象にしたい、みたいなケースがある。
この場合、まず

$total = database->num()

で全体の合計数をひぱってきて

query->addCond("", 数値が~より大きい, $total - 1万)

みたいにすると猛烈に高速に直近のデータだけ取り出せる。(5/3追記:これ、たぶん嘘)

なお、 num() で帰ってくる値と、主キー(数値型でオートインクリメントな場合)との値は少し異なる。
そのため、どうしても正確にやりたい場合は、最後の ID をどこかに保存しておくか、ちょっと微妙だけど、どうしてもというときには

database->getUid()

で数値をとってくることもできる、けど主キーがインクリメントされちゃうのでオススメはできない。って誰かいい方法教えて>最後の数値主キーを高速に取得する方法)


・ソートしないときの検索結果の順序

検索結果に setOrder かけない場合、取り出されるレコードの順序は基本的には不定っぽい。
が、一応、なんか古いものから順に出てくる傾向にはある。
検索対象のレコード数がでかい場合、setOrder かけると遅くなるので、古い順でも、ちょっとくらい不定でもいいや、というときは setOrder をかけずに使いたいところ。


・インデックスの罠

候補が少ないインデックス(たとえば type というフィールドに 0, 1, 2, 3 の4つくらいしかステータスがなくて、一つに数万とかデータ入れちゃってる場合)、このフィールを使った検索で、ある日突然異常にCPUパワーを食うようになるかもです。いや、なるともう、猛烈に食います。
なので、このようなインデックスを使う場合(でかつ、その指定された条件では大量の結果がマッチすることがわかっている場合)は RDBQC_NOIDX かけてインデックスを使わないように設定しないと大やけどします。hint() を見て、RDBQC_NOIDX いれてなくてもインデックス使ってないや、と思っても実際には計算に利用していて、それがまた猛烈にCPUパワーを食います。です。


まぁしかし、便利ですね。テーブル型の key-value ストア。ということでメモ(主に自分用)でした。


Follow yoski on Twitter

ワード

投稿者 aka : 2010年04月02日 11:19  / 2010年04月 / メモ

トラックバック

人気ブログランキング - a++ My RSS 管理人ブログ

このエントリーのトラックバックURL:
http://210.188.206.194/mt-tb-sf.cgi/827

コメント

コメントしてください

あわせて読みたい




保存しますか?


あとで読む | to read | フレッシュリーダー | フレッシュミーティング | RSSフィード.cc | あわせて読みたい | track feed MyRSS管理人