建议TiKV在扫描数据时

需求反馈
请清晰准确地描述问题场景、需求行为及背景信息,更有利于产品同学及时跟进需求
【需求涉及的问题场景】
TiKV在使用多字段组成的组合索引时,只有索引前导字段为等于条件时,才能对索引后面字段应用范围扫描。例如有一个在a,b字段上的索引,IDXA(a,b),则WHERE a=? and b>?才会使用IDXA的a,b两个字段进行扫描,如果条件为,WHERE a>? and b=?时,只会使用索引的a字段进行扫描。这会让索引返回过多的主键信息进行回表扫描操作。
【期望的需求行为】
建议即便在WHERE a>? and b=?时,也能使用索引的两个字段进行扫描,减少从索引返回的主键信息,进而减少不必要的回表扫描操作。
【需求可替代方案】

【背景信息】
如哪些用户将从中获益,以及一些使用场景,任何API设计,模型或者图标都会更有帮助。

你的执行计划是什么样,下面的执行计划IndexRangeScan_8通过a>10的范围扫描索引,然后返回给selection_10算子,该算子通过eq(test.t.b, 329) 过滤符合条件的值,然后在去回表TableRowIDScan_9,在回表前已经进行了过滤

1 个赞

1、这是索引的最左匹配原则,这是索引的存储结构决定的,MySQL也是这样的规则。
2、在即将发版的 v5.4 中会 GA Index merge 的功能,但是这个目前只针对 or 条件的。

1 个赞

可以参考mysql的 index merge 优化,但是这种优化只在or时表现比较优秀,and时经常效率反而不如单列索引,根据楼上大佬的回答 v5.4 中会GA针对 or 条件的Index merge 的功能,如果未来版本真对and也可以用index merge,反而需要考虑是否开启这个参数了。

2 个赞

底层跟MySQL不一样