2017-04-05 65 views
2

如果我有表 表瞭解輔助索引

CREATE TABLE Users (
    userId STRING(36) NOT NULL, 
    contactName STRING(300) NOT NULL, 
    eMail STRING(100) NOT NULL, 
    .... 
) PRIMARY KEY (userId) 

和二級指標

CREATE NULL_FILTERED INDEX ActiveUsersByEMail 
ON Users (
    eMail, 
    isActive, 
) 

和我的選擇記錄:

SELECT * FROM Users WHERE eMail = '[email protected]' AND isActive = TRUE 

扳手將自動查找索引,取userId並給我一個記錄?

或者我需要創建

CREATE NULL_FILTERED INDEX ActiveUsersByEMail_01 
ON Users (
    eMail, 
    isActive, 
    userId 
) 
通過

和第一取用戶名:

SELECT userId from [email protected]{FORCE_INDEX=ActiveUsersByEMail_01} WHERE eMail = '[email protected]' AND isActive = TRUE 

,然後我通過拍攝記錄:

`SELECT * FROM Users WHERE userId = '${userId}'`` 

問題會自動使用或不如果條件與二級索引鍵匹配,標準選擇的扳手二級索引?

+0

請注意,您應該能夠通過詢問該計劃來了解Spanner如何執行您的查詢(使用索引或主表)。這可以通過executeSql方法中的QueryMode選項(https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances.databases.sessions/executeSql)或通過Web界面進行在數據庫上運行查詢。 –

回答

2

您應該使用FORCE_INDEX,因爲Cloud Spanner只會在極少數情況下選擇索引here。您可以使用STORING子句將數據直接添加到索引,允許您直接從索引讀取數據以避免第二次調用。建議您在應用程序中使用常見的查詢模式。

+0

這也意味着:如果在選擇我只包括鍵列扳手再次直接從索引讀取數據,以避免第二次調用? – Chipintoza

0

github我問同樣的問題,原來,這是很容易做到(不產生額外的指數)由:

SELECT * from [email protected]{FORCE_INDEX=ActiveUsersByEMail} WHERE eMail = '[email protected]' AND isActive = TRUE 

此時,搜索是怎麼回事索引和行與所有領域