URL表示

时间:2012-07-10 18:50:21

标签: node.js mongodb performance url database

我想知道如何有效地将网站URL存储在数据库中(在我的情况下是mongoDB)...

问题: 它应该被编入索引以实现快速查询性能,但mongo允许“仅”字段小于1024字节的索引。

我考虑使用散列或base64来缩小网址...但是因为我使用了 一个单线程的webserver(node.js)我不想在它上面做很多事情......

对于实现这一目标的其他方法(替代表示法)是否有任何好的想法 应该是独一无二的......)?

1 个答案:

答案 0 :(得分:4)

在10gen的MongoDB培训期间出现了这个问题,并且散列是可行的解决方案。为URL生成MD5哈希不应该是计算密集型的。我绝对不会建议使用base64编码,因为它只会扩展URL字符串。

目标是创建一个具有高基数的索引,但这并不意味着哈希必须是唯一的。如果在查询中包含散列和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唯一性,但上面的示例只是为了表明从查询的角度来看并不是必需的。当然,任何哈希算法都会有一些碰撞的机会,但是你有比MD5更好的选项,它仍然可以满足1024字节的限制。