谓词下推:数据库查询优化

2023/12/27

谓词下推Predicate Pushdown , sometimes also referred to as Filter Pushdown )是数据库中常用的一种查询优化技术。它使谓词下推到数据源,在进行笛卡尔积前过滤数据,从而减少传输和处理的数据量。

谓词下推的支持非常广泛,包括关系型数据库、非关系型数据库以及 Hadoop、Flink、Spark 等大数据框架。

什么是谓词

在逻辑学中,谓词(predicate)是表示属性或关系的符号 。根据 Gottlob Frege 的说法,谓词的含义是从对象域到真值“true”和“false”的函数。例如,对于集合 $A = \left\{1, 2, 3\right\}$,可以定义一个谓词 $P(x)$,如果 $x \in A$,则 $P(x) = true$,否则 $P(x) = false$。显然,$P(1) = P(2) = P(3) = true$,而 $P(4) = false$

在数据库中,谓词就是返回布尔值即 truefalse 的函数,或是隐式转换为 bool 的函数 。SQL 中的谓词主要有 LKIEBETWEENIS NULLIS NOT NULLINEXISTS,其结果为布尔值,即 truefalse

谓词的使用场景:在 SELECT 语句的 WHERE 子句或 HAVING 子句中,确定哪些行与特定查询相关 。要注意的是,并非所有谓词都可以在 HAVING 子句中使用。

什么是谓词下推

谓词下推实际上是一个简单的概念:

非谓词下推(左)与谓词下推(右)

一个经典的谓词下推示例是 Oracle Exadata,如下:

谓词下推的应用

1 MySQL 索引条件下推优化

索引条件下推ICP )是 MySQL 使用索引减少回表查询的优化。

MySQL 架构(来自 MySQL 参考手册

mysql-architecture

通常把 MySQL 从上至下分为以下几层:

如果没有 ICP ,存储引擎将遍历索引以查找基表中的行,并将它们返回给 MySQL server,该 server 会评估行的 WHERE 条件。 启用 ICP 后,如果要使用索引中的列来评估部分 WHERE 条件,MySQL server 会将这部分 WHERE 条件下推到存储引擎 。然后,存储引擎使用索引检查推送的索引条件,并且仅当满足此条件时,才会从表中读取行。ICP 可以减少存储引擎回表查询次数,减少 MySQL server 访问存储引擎的次数。

当使用“索引条件下推”时,使用 EXPLAINE 命令将在 Extra 列显示 Using index condition,而不是显示 Using index

MySQL 默认启动了 ICP ,但可以通过系统变量 optimizer_switch 控制:

SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';

假设有一个表包含人员及其地址的信息,该表的索引为 (zipcode, lastname, firstname)。如果我们知道一个人 zipcode 的值,我们可以这样查询这个人的姓氏:

SELECT * FROM people
  WHERE zipcode='95054'
  AND lastname LIKE '%etrunia%'
  AND address LIKE '%Main Street%';

根据最左匹配原则,MySQL 会使用索引扫描符合 zipcode='95054 的人员。但 lastname LIKE '%etrunia%' 不能用来减少被扫描行数,所以如果没有 ICP ,这条查询必然回表查询所有 zipcode='95054' 的行。

启用 ICP 后,MySQL 会在读全表前检查是否匹配 lastname LIKE '%etrunia%' 语句。这就避免了匹配条件 zipcode='95054 但不匹配条件 lastname 的回表查询。

2 非关系型数据库、Hadoop、Flink等待补充

总结

总的来说,谓词下推是数据库查询优化的重要手段,它把条件过滤的步骤下推到数据源,减少网络 I/O,减少处理的数据量,从而提高查询性能。

参考

  1. The point of predicate pushdown, dbms2.

  2. Demystifying Predicate Pushdown: A Guide to Optimized Database Queries, airbyte.

  3. MySQL 8.0 Reference Manual: Index Condition Pushdown Optimization, mysql.

  4. MySQL索引下推(ICP)简单理解及例子, maoyingdong.

文章链接:https://nohsueh.github.io/post/20231227/ppd_database_query_optimization/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nohsueh。