天天看点

myrocks index condition pushdownindex condition pushdownserver层engine层other

title: mysql · myrocks · myrocks index condition pushdown

引入icp之前

myrocks index condition pushdownindex condition pushdownserver层engine层other

引入icp之后

myrocks index condition pushdownindex condition pushdownserver层engine层other

再来看个例子

这里总结下icp的条件

不能是覆盖索引(cover index)

server层主要负责判断是否符合icp的条件,符合icp则把需要的condition push到engine层。

engine层通过二级索引查找数据时,用server层push的condition再做一次判断,如果符合条件才会去查找主索引。

目前mysql支持icp的引擎有myisam和innodb,myrocks引入rocksdb后,也支持了icp。

server层实现是一样的,engine层我们主要介绍innodb和rocksdb的实现。

关键代码片段如下

而这里通过covering_keys来判断并排除使用了cover index的情况。covering_keys是一个bitmap,保存了所有可能用到的覆盖索引。在解析查询列以及条件列时会设置covering_keys,详细可以参考setup_fields,setup_wild,setup_conds。

innodb在扫描二级索引时会根据是否有push condition来检查记录是否符合条件(row_search_idx_cond_check)

逻辑如下:

典型的堆栈如下

rocksdb在扫描二级索引时也会根据是否有push condition来检查记录是否符合条件

逻辑如下

icp对cover index作出了严格的限制,而实际上应该可以放开此限制,这样可以减少enging层传第给server层的数据量,至少可以减少server层的内存使用。欢迎指正!

继续阅读