2017-02-17 99 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的部分索引,分別會有類似的分佈,也不應該引起熱點。

相關問題