我应该对属性进行非规范化以减少App Engine所需的索引数量吗?

时间:2010-07-21 19:43:38

标签: google-app-engine optimization indexing denormalization

我的一个查询可以根据用户输入采用许多不同的过滤器和排序顺序。这会生成一个包含50多个索引的巨大index.yaml文件。

我正在考虑将我的许多布尔和多选(字符串)属性非规范化为单个字符串列表属性。这样,我将减少查询组合的数量,因为大多数查询只会在字符串列表属性中添加一个过滤器,我的索引计数应该会大幅减少。

肯定会增加我的存储容量,但这不是真正的问题,因为我没有那么多的数据。

这听起来不是一个好主意,或者这种方法有任何其他缺点吗?

3 个答案:

答案 0 :(得分:3)

与往常一样,这取决于您想要查询实体的方式。对于大多数类型的查询,您可以对这样的属性列表执行,App Engine已经包含一个自动构建的索引,您不必在app.yaml中指定。同样,您要执行的大多数查询都需要复合索引,您无法使用列表属性,或者需要在该列表属性上使用“爆炸”索引。

如果您告诉我们您通常在此对象上运行的查询类型,我们可以为您提供更具体的建议。

答案 1 :(得分:2)

对数据进行非规范化以减少索引数量听起来像是一个很好的权衡。减少所需索引的数量将减少更新的索引(尽管您的一个索引将有更多更新);目前还不清楚这将如何影响GAE的表现。如果您保留原始字段(因为您将数据复制到字符串列表属性中),大小当然会更大,但除非您的实体已经很大,否则这可能不会太大。

这很复杂,因为列表上的索引将在每个实体的列表中包含每个元素的一个条目(而不是每个实体只有一个条目)。这肯定会影响空间和查询性能。另外,要小心创建包含多个列表属性的索引,否则可能会遇到爆炸索引的问题(多个列表属性=>每个列表中每个值组合的一个索引条目)。

尝试实验,看看它在实践中是如何运作的(使用AppStats!)。

答案 2 :(得分:0)

“这肯定会增加我的存储容量,但这不是一个真正的问题,因为我的数据不会那么多。

如果这是真的,那么你没有理由反规范化。