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

马克西姆·科尔钦(Maksim Kolchin)

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:来自服务器的错误:code = 2200 [Invalid query] message =“无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果尽管性能不可预测,仍要执行此查询,请使用ALLOW FILTERING”

ScyllaDB 3.0.1。

皮特·萨纳(Piotr Sarna)

感谢您找到一个有趣的特殊情况:)

问题在于第二个查询限制了聚簇列(b, d)聚簇列本身并不构成聚簇键前缀。当然,它d是索引的,因此应该发生a在键前缀优化中并d用作索引列。

取而代之的是,它错误地决定(b, d)不形成前缀,因此在不考虑d具有索引的情况下从优化候选中将其丢弃

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么@Autowired不适用于通用类型T?

为什么忽略SIGTRAP不适用于asm?

为什么Hibernate HSQL Concat不适用于MSSQL?

如果指定了分区键,Cassandra二级索引是否已优化?

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

为什么cout不适用于pthreads?

为什么Map在Groovy中不适用于GString?

为什么Javascript IF keyCode === Enter键或空格键不适用于NVDA屏幕阅读器?

Vue.set反应性不适用于第二级子对象

为什么通用引用不适用于数组?

路由前缀不适用于索引

群集顺序不适用于复合分区键

为什么Cassandra没有二级索引?

为什么下界不适用于向量对

为什么二级索引在Cassandra中效率较低?

为什么第二个参数不适用于strtol?

为什么maxWidth属性不适用于EditText?

为什么constexpr不适用于构造函数?

二级缓存不适用于Spring和JSF

为什么fwrite不适用于C中的二进制文件?

为什么php mongo $ in搜索不适用于ObjectId?

仅使用适用于.net的AWS sdk中的两个全局二级索引来查询DynamoDB表

在DynamoDB表中具有不带排序键的全局二级索引有什么意义?

为什么Vue.js键修饰符仅适用于`<button>`而不适用于`<div>`?

android中的第二级回调不适用于嵌套查询

为什么方向属性不适用于块级元素

为什么我的函数适用于矩阵但为什么不适用于向量?

为什么 Array().splice 不适用于在索引处插入值?

为什么“.includes”不适用于我的二维数组?