我一直想知道这件事。在CouchDB中,我们有一些相当的日志ID ...例如:
“000ab56cb24aef9b817ac98d55695c6a”
现在,如果我们正在搜索此项目并浏览视图创建的树结构。这似乎是一个简单的整数,因为id会快得多。如果我们使用64位整数,那么它将是一个简单的CMP,后面跟着一个JMP(假设Erlang代码使用的是JIT,但你得到了我的观点)。
对于字符串,我假设我们从ID或其他东西生成哈希值,但在某些时候我们必须对所有33个字符进行字符比较...这不会影响性能吗?
答案 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是否可以创建这样的代码,我不能说。