4

私はマルチテナントWebアプリケーションに取り組んでいます。かなり大きく、多くのドキュメントが収集されている可能性があるユーザーのコンテナをクリアする必要があります。次のような多くのドキュメントを削除できるようにする必要があります。

    return self::remove(array('LISTID' => $listId), array('safe' => true));

場合によっては、この基準を満たす多くのドキュメントが存在する可能性があります。たとえば、数十万、さらには数百万のドキュメントです。この操作には時間がかかり、サーバーが抑制されるのではないかと心配しています。多くのドキュメントがある場合、そのような操作をキューに入れて、擬似コードのようにオフラインでそれらを削除することは価値があります。

while (there are documents) {
  delete(1000 documents);
  sleep();
}

この場合、mongodbの小さなportiosでデータを削除するにはどうすればよいでしょうか。また、何らかの理由で、mongodbではかなり多くの行の削除がかなり高速に行われることに気付きました。mongodbにデータを格納するプロトタイプがあり、mysqlでは同様の数の行を削除するのにはるかに時間がかかりますが、mysqlではテーブルの各行に他のテーブルへの参照がありますデータを使用しますが、依存テーブルにレコードがない場合でも、mongodbでははるかに高速に見えます。mongodbではすべてのデータをドキュメントに格納しますが、とにかく私にはかなり奇妙に思えます。または多分それは余分ですか?

ありがとうございました。

4

1 に答える 1

6

これは、アプリケーションで行う必要があることです。PHP では、次のようなことができます。

$found = false;
$ids = $collection->find(array('LISTID' => $listId), array('_id' => 1))->limit(1000);
do {
    $found = 0;
    $idsToDelete = array(); // we'll collect all the ids here, so that we can delete them in a batch
    foreach( $ids as $res )
    {
        $found++;
        $idsToDelete[] = $res['_id'];
    }
    $collection->remove(array('_id' => array( '$in' => $idsToDelete )));
    sleep(15);
} while ( $found );

LISTID にインデックスがあることを本当に確認する必要があります。そうしないと、処理が非常にfind(array('LISTID' => $listId)遅くなる可能性があります。

于 2012-04-27T10:52:16.717 に答える