扫描完全下推(FastTraverse)

当需要查询大量数据的时候,引擎层访问数据、SQL层的交互和计算都会占用大量的开销。PolarDB MySQL版会将优化器扫描下推到引擎层进行计算,极大的减少性能开销,提升查询性能。

前提条件

集群版本需为PolarDB MySQL版8.0版本且修订版本需满足如下条件:

  • 8.0.1.1.5或以上。

  • 8.0.2.2.0 或以上。

如何查看集群版本,请参见查询版本号

背景信息

在社区MySQL版本8.0.13中,count(*)操作并没有由InnoDB引擎执行,每一行访问的交互代价依然很大。在社区MySQL版本8.0.18中,其并行扫描虽然实现了在InnoDB引擎中快速遍历page中的行记录,但引擎会忽视优化器选择的路径,强制选择主键路径。

PolarDB MySQL版真正实现了扫描的完全下推,它会在优化器选择的索引page上快速遍历(FastTraverse)数据行。同时也规避了回表、MVCC恢复快照版本长时间持有page锁对数据更新的影响。

使用方法

扫描完全下推(FastTraverse)功能在支持的版本上默认开启。

示例

本文基于TPCH的Schema进行举例。执行EXPLAIN SQL查看执行计划。

mysql> EXPLAIN SELECT COUNT(*) FROM lineitem\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: lineitem
   partitions: NULL
         type: index
possible_keys: NULL
          key: i_l_shipdate
      key_len: 4
          ref: NULL
         rows: 59440464
     filtered: 100.00
        Extra: Using index

性能效果

基于TPCH 10 scale的数据,针对上文所述的查询示例。社区MySQL 8.0.13版本、社区MySQL 8.0.18版本(innodb_parallel_read_threads取值为1)与PolarDB的性能对比如下:扫描下推效果