1

WebサイトのURLをデータベース(私の場合はmongoDB)に効率的に保存する方法を知りたいです...

問題:高速クエリパフォーマンスを実現するにはインデックスを作成する必要がありますが、mongoでは1024バイトよりも小さいフィールドのインデックスのみが許可されます。

URLを縮小するためにハッシュまたはbase64を考えました...しかし、シングルスレッドのWebサーバー(node.js)を使用しているので、重いことはしたくありません...

これを達成するための他の方法について何か良いアイデアはありますか(代替表現は一意である必要があります...)?

4

1 に答える 1

4

この質問は、10genのMongoDBトレーニング中に発生し、実行可能なソリューションとしてハッシュが提示されます。URLのMD5ハッシュを生成することは、計算集約的であってはなりません。URL文字列を拡張するだけなので、base64エンコーディングは絶対にお勧めしません。

目標は、カーディナリティの高いインデックスを作成することですが、それはハッシュが一意である必要があるという意味ではありません。クエリにハッシュとURLの両方を含めると、選択性の高いハッシュインデックスを利用できるようになり、MongoDBはインデックスヒット間でURLを照合します。次の例では、両方のURLにハッシュ衝突があるとしましょう。

$ mongo --quiet
> db.urls.insert({_id: 1, url: "http://google.com", hash: "c7b920f"});
> db.urls.insert({_id: 2, url: "http://yahoo.com", hash: "c7b920f"});
> db.urls.find({hash: "c7b920f"})
{ "_id" : 1, "url" : "http://google.com", "hash" : "c7b920f" }
{ "_id" : 2, "url" : "http://yahoo.com", "hash" : "c7b920f" }

> db.urls.find({hash: "c7b920f", url: "http://google.com"})
{ "_id" : 1, "url" : "http://google.com", "hash" : "c7b920f" }

> db.urls.ensureIndex({hash: 1})
> db.urls.find({hash: "c7b920f", url: "http://google.com"}).explain()
{
    "cursor" : "BtreeCursor hash_1",
    "nscanned" : 2,
    "nscannedObjects" : 2,
    "n" : 1,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "hash" : [
            [
                "c7b920f",
                "c7b920f"
            ]
        ]
    },
    "server" : "localhost:27017"
}

コレクション全体でURLの一意性を保証するための追加のビジネス要件があるかどうかはわかりませんが、上記の例は、クエリの観点からは必要ないことを示しています。もちろん、どのハッシュアルゴリズムでも衝突の可能性がありますが、それでも1024バイトの制限を満たすMD5よりも優れたオプションがあります。

于 2012-07-10T19:17:58.347 に答える