插入文档时,如果密钥是在客户端生成的。它会减慢单个机器或群集上的写入速度吗?
我问,因为我认为服务器端生成的密钥肯定是唯一的,不需要检查唯一性。 但是在客户端生成密钥时要记住哪些缺点或事项?(在单机,分片,主 - 主复制即将到来)
答案 0 :(得分:4)
在客户端生成密钥不应对ArangoDB产生任何显着的性能影响。无论如何,ArangoDB将解析传入的JSON,并始终在其中查找_key
属性。如果它不存在,它将自己创建一个。如果它存在于JSON中,它将被验证语法正确性(因为文档键中只允许一些字符)。后一种操作仅在JSON中指定_key
值时发生,但其影响很可能是微不足道的,尤其是与插入文档时发生的其他事情相比,例如网络延迟,磁盘写入等。
无论是否指定了用户定义的_key
值,ArangoDB都会检查具有相同密钥的文档的集合的主索引。如果存在,则插入将失败,并具有唯一的键约束违例。如果它不存在,插入将继续。如上所述,此操作将始终发生。在主索引中查找文档具有O(1)的摊销复杂度,并且与网络延迟,磁盘写入等相比应该可以忽略不计。请注意,即使ArangoDB生成密钥,也会始终进行此检查。这是因为集合可能包含客户端生成的密钥和ArangoDB生成的密钥的混合,并且ArangoDB仍然必须确保它还没有生成客户端之前也生成的密钥。
在集群中,除了客户端将向协调器节点发送插入之外,还会发生相同的步骤,协调器节点需要将插入转发到dbserver节点。这与是否指定密钥无关。 _key
属性可能是集合的分片键,因此协调器将请求发送到一个dbserver节点。如果_key
属性不是集合的分片键,因为它显式设置了不同的分片键,则无论如何都不允许使用用户定义的键。
到目前为止的摘要:就ArangoDB而言,在客户端生成密钥或让ArangoDB生成密钥之间不应存在相关的性能差异。
在客户端应用程序中生成密钥的优点和缺点包括:
+
客户端应用程序可以确保密钥遵循ArangoDB生成的密钥无法保证的一些所需模式/语法,并且可以完全控制密钥创建算法(例如,可以在多个密钥中使用特定于租户的密钥 - 申请)
-
客户端可能需要一些数据存储来存储其密钥生成器状态(例如,最后生成的密钥的id)以防止重复(也在重新启动客户端应用程序之后)
-