长ID的性能

时间:2010-02-01 14:52:23

标签: couchdb

我一直想知道这件事。在CouchDB中,我们有一些相当的日志ID ...例如:

“000ab56cb24aef9b817ac98d55695c6a”

现在,如果我们正在搜索此项目并浏览视图创建的树结构。这似乎是一个简单的整数,因为id会快得多。如果我们使用64位整数,那么它将是一个简单的CMP,后面跟着一个JMP(假设Erlang代码使用的是JIT,但你得到了我的观点)。

对于字符串,我假设我们从ID或其他东西生成哈希值,但在某些时候我们必须对所有33个字符进行字符比较...这不会影响性能吗?

2 个答案:

答案 0 :(得分:2)

来自CouchDB:权威指南:

  

我需要在此画一张照片   有一点,但原因是如果你   想到理想化的btree,当你   使用UUID你可能会遇到任何问题   该树中的根节点数,所以   附加只有你自然的性质   写每个节点和   在树上面的一切。但   如果你使用单调增加   id's然后你就是无效的   在右手边的路径   因此,树的数量最小化   需要重写的节点。将   单调地说是一样的   也减少了。它应该   如果你有更新可以在技术上工作   保证打一个或两个节点   但是在树的内部   这很难证明。

因此顺序ID提供了性能优势,但是,您必须记住,当您有多个数据库时,这是不可维护的,因为ID会发生冲突。

答案 1 :(得分:2)

简短的回答是,是的,它当然会影响性能,因为密钥长度将直接影响走树的时间。

它也会影响存储,因为较长的键占用更多空间,空间需要时间。

然而,您缺少的细微差别是,虽然Couch CAN(并且确实)为您分配了新ID,但并不是必需的。接受自己的ID而非生成自己的ID非常乐意。因此,如果密钥长度困扰您,您可以自由使用更短的密钥。

然而,鉴于沙发的“json”性质,它几乎是一个基于“文本”的数据库。在普通的Couch实例中存储的二进制数据并不多(附件不能承受,但即使是那些我认为存储在BASE64中的,我可能也错了)。

所以,虽然,64位是最有效的,但简单的事实是Couch被设计为适用于任何密钥,而“任何密钥”最容易用文本表达。

最后,事实上,关键比较的成本与磁盘I / O获取时间和数据的JSON编组(特别是写入时)相比相形见绌。转换到这样的系统所获得的任何实际收益都可能对整体性能没有“现实世界”的影响。

如果你想真正加速Couch密钥系统,可以将密钥例程编码为阻止64Bit longs的密钥,并对这些密钥进行编码(就像你说的那样)。 8个字节的文本与64位“long int”相同。从理论上讲,这将使您在关键比较中获得8倍的性能提升。 erlang是否可以创建这样的代码,我不能说。