我想知道如何有效地将网站URL存储在数据库中(在我的情况下是mongoDB)...
问题: 它应该被编入索引以实现快速查询性能,但mongo允许“仅”字段小于1024字节的索引。
我考虑使用散列或base64来缩小网址...但是因为我使用了 一个单线程的webserver(node.js)我不想在它上面做很多事情......
对于实现这一目标的其他方法(替代表示法)是否有任何好的想法 应该是独一无二的......)?
答案 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字节的限制。