3

Scylla DB 为二级索引实现了所谓的“键前缀优化”,如果指定了主键的一部分,它将消除过滤。例如,可以SELECT * FROM A WHERE a = 'a' AND b = 'a' AND d = 'a';在 table上执行A

CREATE TABLE A (
    a text,
    b text,
    c text,
    d text,
    PRIMARY KEY(a,b,c)
);
CREATE INDEX A_index ON A (d);

A.d但如果是一个聚类列,它就不起作用。例如如下表B

CREATE TABLE B (
    a text,
    b text,
    c text,
    d text,
    PRIMARY KEY(a,b,c,d)
);
CREATE INDEX B_index ON B (d);

上面的 SELECT 查询失败并出现错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果您想在性能不可预测的情况下执行此查询,请使用 ALLOW FILTERING"

ScyllaDB 3.0.1。

4

1 回答 1

4

感谢您找到一个有趣的角落案例 :)

问题是第二个查询限制了聚类列(b, d),它本身并没有形成聚类键前缀。当然,d是索引的,所以应该发生的是a在键前缀优化中使用并d作为索引列。

相反,它错误地决定(b, d)不形成前缀,因此它被从优化候选者中丢弃,而不考虑d具有索引。

这种简化将得到修复,我在这里创建了一个错误跟踪器问题:https ://github.com/scylladb/scylla/issues/4178

于 2019-02-01T08:26:21.210 回答