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。
答案 0 :(得分:4)
感谢找到有趣的极端案例:)
问题在于第二个查询限制了群集列(b, d)
,群集列本身并不构成群集键前缀。当然,d
已建立索引,因此应该发生的事情是在密钥前缀优化中使用a
并将d
用作索引列。
相反,错误地认为(b, d)
没有形成前缀,因此没有考虑d
有索引的情况就从优化候选中将其丢弃。
此简化将得到解决,我在此处创建了一个错误跟踪器问题:https://github.com/scylladb/scylla/issues/4178