2017-02-17 139 views
0

我有一个表格,其中包含一个布尔型字段IsNew,它表示相应的实体是否是新的。我想定期查询特定状态下的所有实体。索引对布尔(或枚举)有什么影响?它会创造一个热点吗?对QPS有任何限制?在布尔上有一个索引是个好主意吗?

回答

0

辅助索引在内部实现为具有基于声明的辅助索引键的主键以及任何明确未在辅助索引中提及的索引表键的表。所以,说你有一个像这样的表:

CREATE TABLE UserThings (
    UserId INT64 NOT NULL, 
    ThingId INT64 NOT NULL, 
    ... 
    IsNew BOOL NOT NULL, 
    ... 
) PRIMARY KEY(UserId, ThingId), ... 

你创建这样一个指标:

CREATE INDEX UserThingsByIsNew ON UserThings(IsNew, ThingId) 

这将创建一个内部表格上看起来是这样的:

CREATE TABLE UserThingsByStatus_Index (
    IsNew BOOL, 
    ThingId INT64 NOT NULL, 
    UserId INT64 NOT NULL, 
) PRIMARY KEY(new, ThingId, UserId), ... 

因此,当您更新UserThings的行以更改IsNew列的值时,它将删除UserThingsByIsNew_Index中的旧行并插入额外的行。如果行的IsNew值以高频率变化,这将倾向于在索引中产生大量流失。这可能不是问题,但是只有通过在实际工作负载下持续测试您的场景才能真正了解。

如果您不太频繁更新实体的IsNew字段,那么您可能不会有任何hot-spotting问题。这就是为什么我早些时候提到Cloud Spanner会将原始表键添加到索引的键上:假设您的原始表行由表的键很好地分布,那么IsNew = true和IsNew = false的部分索引,分别会有类似的分布,也不应该引起热点。

相关问题