与根实体的距离是否会影响性能?

时间:2014-03-16 02:39:53

标签: google-app-engine google-cloud-datastore

我很好奇实体组中实体到“根”实体的距离是否会影响数据库性能。

我很好奇,因为我正在考虑使用parent属性作为一种“链表”的想法,就像实体的数据结构一样,根实体是列表的尾部,而新的值也是一样的(lisp)这个词的意义)作为单独联系的孩子。

类似于实体 - >实体 - > ... - >实体 - > RootEntity,其中 - >是父母关系。

3 个答案:

答案 0 :(得分:2)

我同意Andrei和Jeffrey的意见,并想补充一些与他们部分重叠的想法。

首先,密钥大小随列表长度的增长意味着设计将严重缩放。想象一下包含“仅”1000个实体的链表。 Andrei提到的“种类 - 标识符对的序列”将在尾部实体密钥中存储1000种类型 - 标识符对,在倒数第二个实体密钥中存储999对,依此类推。元数据空间使用将近似为O(标识符大小平方)。对于实体的元数据,可能存在大约一兆字节的未记录字节计数上限。最大实际列表长度将取决于服务器性能,随着列表变得更长,并且(可能)随机超时,出现以上线性CPU成本增长的症状。如果不是一个好主意,那将是一个不幸的不妥。对于20个实体来说,这可能会很好,但是超过100个实体会变得迟钝。

其次,父链接是不可变的这一事实意味着在这样的列表上可能的唯一有效修改附加到列表,并在任何点截断整个尾部。你可能知道这一点,杰弗里也暗示了这一点。第三,因为它是一个单独链接的列表,父母无法知道它的子(ren),并且难以检测到的bug可能会将多个子节点附加到列表中间某处的同一父节点,从而生成一个树。

答案 1 :(得分:1)

要非常小心:实体的父母实际上是其关键的一部分。因此,如果要插入元素或移动子树,则必须删除并重新添加实体。如果该实体有孩子,该孩子的钥匙也需要改变。所以你最终将不得不删除/重新添加作为后代的每个实体......不好!

请参阅:https://developers.google.com/appengine/docs/java/datastore/entities

  

实体与其父项之间的关联是永久性的,一旦创建实体就无法更改。

注意Jeff Schnitzer(Objectify成名)最近discussed this on he Objectify mailing list,他就如何在单个公共实体组中实现树结构提出了一些建议。

答案 2 :(得分:1)

对性能的影响取决于您计划如何使用此实体。在某些情况下(即检索父母的所有孩子或从孩子的钥匙中获取父母钥匙),表演可能会改善。

另一方面,您可能会看到实体更新出现问题,因为会有更多"写入"在每次更新时(它可能会影响成本而不是性能):

  

但是,如果实体具有祖先,则需要为每个实体进行写入   除了可能的属性值和祖先的组合   那些实体本身。

每秒可以更新单个实体组中的实体数量也有限制。

另请注意,存储的数据量可能会大幅增加,因为大多数实体都有长按键:

  

标识实体的完整密钥由一系列序列组成   kind-identifier对指定其祖先路径并终止   与实体本身的那些。

如果你为这些实体索引了几个属性,那么由于所有必需的索引,存储的数据将会爆炸。