在布尔值上有一个索引是一个好主意吗?

时间:2017-02-17 02:49:19

标签: google-cloud-platform google-cloud-spanner

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

1 个答案:

答案 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,将分别具有相似的分布,并且不应该导致热点。