我有一个带有布尔字段IsNew
的表,表示相应的实体是否是新的。我想定期查询特定状态下的所有实体。索引对布尔值(或枚举)有什么影响?它会创造一个热点吗?对QPS有任何限制吗?
答案 0 :(得分: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,将分别具有相似的分布,并且不应该导致热点。