当需要查询大量数据的时候,引擎层访问数据、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的性能对比如下: