title: mysql · myrocks · myrocks index condition pushdown
引入icp之前

引入icp之后
再来看个例子
这里总结下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层的内存使用。欢迎指正!