2017-04-05 63 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 

此时,搜索是怎么回事索引和行与所有领域