2

今のところ、MongoDB をいじって、どのような優れた機能があるかを確認しています。投稿、作成者、およびコメントを含む、非常に基本的な単純なブログ システムを表す小さなテスト スイートを作成しました。

MongoRegEx クラス (PHP ドライバー) を使用する検索機能を試してみました。ここでは、「/I」で大文字と小文字を区別して、「lorem ipsum」という文の後のすべての投稿コンテンツと投稿タイトルを検索しています。

私のコードは次のようになります。

$regex = new MongoRegEx('/lorem ipsum/i');  
$query = array('post' => $regex, 'post_title' => $regex);

しかし、私は何が起こるかについて混乱し、唖然としています。すべてのクエリの実行時間をチェックします (クエリの前後にマイクロタイムを設定し、小数点以下 15 桁で時間を取得します)。

最初のテストでは、110.000 のブログ ドキュメントと 5000 人の著者を追加しました。すべてランダムに生成されました。検索すると、「lorem ipsum」という文を含む 6824 件の投稿が見つかり、検索に 0.000057935714722 秒かかります。これは、MongoDB サービスを (Windows を使用して) リセットしたのもので、_id のデフォルト以外のインデックスはありません。

MongoDB は B ツリー インデックスを使用しますが、これは全文検索にはあまり効率的ではありません。投稿コンテンツ属性にインデックスを作成すると、上記と同じクエリが 0.000150918960571 で実行されます。これは、インデックスがない場合よりもかなり遅くなります (0.000092983245849 倍遅くなります)。これは、B ツリー カーソルを使用するため、いくつかの理由で発生する可能性があります。

しかし、どのようにしてクエリを高速に実行できるかについての説明を検索しようとしました。おそらくすべてが RAM に保存されていると思います (4GB あり、データベースは約 500MB です)。これが、完全な結果を得るために mongodb サービスを再起動しようとする理由です。

MongoDB の経験がある人なら誰でも、この種の全文検索で何が起こっているのかを理解するのに役立ちますか?

敬具 - メスティカ

4

1 に答える 1

4

結果を繰り返し処理しなかったと思いますか?find() だけでは、ドライバーはサーバーにクエリを送信しません。そのためには、少なくとも 1 つの結果を取得する必要があります。MongoDB がこれほど高速であるとは思いません。また、エラーがベンチマークに含まれていると思います。

第二に、フィールドの値の先頭に が固定されていない正規表現検索では^、インデックスはまったく使用されません。実際に何が起こっているかを確認するには、explain() を試してみてください

于 2012-05-03T13:49:31.527 に答える