为什么键前缀优化不适用于群集列上的二级索引?

时间:2019-01-31 14:44:32

标签: scylla

Scylla DB实现了辅助索引,即所谓的“ key prefix optimization”,如果指定了主键的一部分,则消除了过滤。例如。可以在表SELECT * FROM A WHERE a = 'a' AND b = 'a' AND d = 'a';上执行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:来自服务器的错误:代码= 2200 [无效查询]   message =“无法执行此查询,因为它可能涉及数据过滤   因此可能具有无法预测的性能。如果要执行   尽管性能不可预测,但此查询仍使用ALLOW   正在过滤”

ScyllaDB 3.0.1。

1 个答案:

答案 0 :(得分:4)

感谢找到有趣的极端案例:)

问题在于第二个查询限制了群集列(b, d),群集列本身并不构成群集键前缀。当然,d已建立索引,因此应该发生的事情是在密钥前缀优化中使用a并将d用作索引列。

相反,错误地认为(b, d)没有形成前缀,因此没有考虑d有索引的情况就从优化候选中将其丢弃。

此简化将得到解决,我在此处创建了一个错误跟踪器问题:https://github.com/scylladb/scylla/issues/4178