2

berkeley db 5.x C APIを使用して、プレフィックスと一致するキーを持つすべてのレコードを取得する方法はありますか?

(データベース全体をスキャンせずに)

たぶんBtreeプレフィックス比較カスタムコールバックで?

4

1 に答える 1

4

ソリューションには2つの部分があります。まず、カスタムキー比較機能を使用する必要があります。

dbp->set_bt_compare(dbp, cmp_fn);

比較機能では、データベース内で同じプレフィックスを持つキーが隣り合ってソートされるようにします。これは、比較よりも小さいものの束と同じくらい単純である可能性があるため、のようなものは。0x000000000000000000000001よりも小さくなり0x000000000000000000000002ます。

検索を行うには、カーソルを開き、cursor->get()フラグを使用してDB_SET_RANGEを実行します。開始キーをプレフィックス範囲の先頭に設定します。たとえば、プレフィックスが付いたキーを探している場合は0x1138、キーをに設定します0x113800000000000000000000cursor->get()次に、で呼び出し続けDB_NEXTます。0x1138プレフィックスのないキーが表示されたら、完了です。

この手法では、データベース全体をスキャンする必要はありません。最初のDB_SET_RANGE呼び出しでカーソルが適切な場所から開始され、ツリー内でレコードがすべて隣り合っているためです。

于 2012-10-02T18:17:49.673 に答える