【问题标题】:How does GAE datastore index null valuesGAE 数据存储如何索引空值
【发布时间】:2014-08-04 17:56:03
【问题描述】:

我担心读取性能,我想知道将索引字段值作为null 是否比给它一个值更快。

我有很多带有状态字段的项目。 status 可以是 "pending""invalid""banned" 等...

我的典型请求是找到status“ok”(或null)。由于 null 字段未保存到数据存储区,因此避免使用我可以用 null 替换的“无用”默认值已经是一种胜利。所以我已经有更少的磁盘空间使用了。

但我想知道,由于数据存储是 noSql,它不知道数据结构,也不知道缺少列 status。那么它是如何进行status = null请求检查的呢?

它是否必须检查每一行的所有列以试图找到我的列?还是有一些更智能的机制?

例如,索引 (null=Entity,key) 当我们传递一个明确表示它为 null 的列时(如果是这种情况,Objectify 是否尊重这一点,并在将字段传递给本机 API 时将其保留在列表中,如果它是空的?)

主要是哪个请求更有效率?

【问题讨论】:

    标签: google-cloud-datastore objectify


    【解决方案1】:

    如果您指定应为字段/属性编制索引,则低级 API(和 Objectify)存储和索引空值。对于 Objectify,如果要更改此行为,可以指定 @Ignore(IfNull.class) 或 @Unindex(IfNull.class)。您可能会将其与其他数据访问 API 的文档混淆。

    由于 GAE 只允许您查询索引字段,您的问题实际上是:是索引空值并查询它们更好,还是查询所有内容并过滤掉非空值?

    这纯粹是一个稀疏性的问题。如果绝大多数记录包含空值,那么您最好查询所有内容并手动过滤掉不需要的内容。少量额外的实体读取可能比更新和存储额外的索引更便宜。另一方面,如果空记录只占您数据的一小部分,那么您肯定需要索引。

    这种索引困境并非 GAE 独有。所有数据库都针对低基数字段提出了这个问题;只是他们会为您进行表扫描(测试和跳过行)。

    如果您真的想微调此行为,请阅读 Objectify 关于部分索引的文档。

    【讨论】:

    • 感谢stickfigure,我没有考虑读取和抛出不需要的条目的替代方法(有点可怜,但仍然比在非常常见的情况下写入索引2个额外条目的成本更低)。最后,我最终检查是否存在给定名称的列(仅在没有列时显示该行),这可能需要成本,但它是学习的替代方法
    【解决方案2】:

    null 也被视为数据存储中的一个值,并且索引中将有空值条目。 Datastore doc says, "Datastore 区分不拥有属性的实体和拥有空值属性的实体"

    Datastore 永远不会检查所有列或所有记录。如果您对此属性进行了索引,它将仅从索引中获取记录。如果未编制索引,则无法通过该属性进行查询。

    就查询性能而言,应该是一样的,但你可以随时进行分析和检查。

    【讨论】:

    • 谢谢 Ashish,对不起,我有点懒得阅读它接缝的文档 :) (我应该在写问题之前完成它)。这就是说,我仍然没有关于性能的答案。我将投票支持 Stickfigure 的答案,因为他通过避免编写无用的索引(部分是性能答案)向我提出了一个真正的替代方案
    猜你喜欢
    • 2015-04-10
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多