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 = 'test@test.com' AND isActive = TRUE

spanner 会自动查看索引,获取 userId 并给我一个记录?

或者我需要创建

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

并首先通过以下方式获取 userId:

SELECT userId from Users@{FORCE_INDEX=ActiveUsersByEMail_01} WHERE eMail = 'test@test.com' AND isActive = TRUE

然后我通过以下方式记录:

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

如果条件匹配二级索引键,问题是否自动使用或不使用扳手二级索引进行标准选择?

4

2 回答 2

2

您应该使用 FORCE_INDEX,因为 Cloud Spanner 只会在极少数情况下选择索引,如此所述。您可以使用STORING子句将数据直接添加到索引中,让您可以直接从索引中读取数据,以避免第二次调用。这建议用于应用程序中的常见查询模式。

于 2017-04-05T22:36:31.557 回答
0

github我问了同样的问题,结果证明这很容易完成(无需创建额外的索引):

SELECT * from Users@{FORCE_INDEX=ActiveUsersByEMail} WHERE eMail = 'test@test.com' AND isActive = TRUE

此时搜索正在进行索引和行带有所有字段

于 2017-04-06T08:34:02.413 回答