url表示

我想知道如何有效地存储在一个数据库中的网站url(mongoDB在我的情况)…

问题:它应该被索引来实现快速的查询性能,但是mongo允许只有字节小于1024字节的索引。

我想过哈希或base64来缩小url…但由于我使用单线程的networking服务器(node.js),我不想在它上面做沉重的东西…

有没有关于其他方式来实现这一点的好主意(替代表示应该是唯一的…)?

10gen的MongoDB培训期间出现了这个问题,并将哈希表示为可行的解决scheme。 生成一个URL的MD5散列不应该是计算密集型的。 我绝对不会build议base64编码,因为这只会扩大URLstring。

目标是创build一个高基数的索引,但这并不意味着哈希必须是唯一的。 如果在查询中同时包含散列和URL,则将利用高度select性的散列索引,然后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唯一性,但上面的示例只是表明从查询angular度来看这不是必需的。 当然,任何散列algorithm都会有碰撞的机会,但是比MD5有更好的select,它仍然会满足1024字节的限制。