我有一个带有布尔字段的表IsNew
,它指示相应的实体是否是新的。我想定期查询处于特定状态的所有实体。在布尔(或枚举)上设置索引有什么含义?它会创建一个热点吗?QPS有什么限制吗?
问问题
329 次
1 回答
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
不过于频繁地更新实体字段,那么您可能不会遇到任何热点问题。这就是为什么我之前提到 Cloud Spanner 还将原始表键附加到索引的键上:假设您的原始表行由表的键分布良好,那么 IsNew=true 和 IsNew=false 的索引部分,分别会有类似的分布,并且不应该引起热点。
于 2017-02-17T02:49:19.000 回答