目录文档:MySQL 源码|源码剖析文档目录
多重等式谓词(MEP)
在 SQL 的优化过程中,我们将 WHERE
子句中的条件、HAVING
子句中的条件以及 JOIN
子句中的条件称为 谓词(predicate)。优化器需要对谓词进行评估,以决定如何有效地进行查询。
为方便表述,我们在 MySQL 存在的各种 谓词 中,定义如下两个概念:
简单等式谓词(simple equality predicate) 简单等式谓词 包括以下两种 谓词:
- 字段与字段相等,即
field1 = field2
,例如a = b
或A.c = B.c
- 字段与常量相等,即
field = const
或const = field
,例如a = 1
行等式谓词(row equality predicate) 行等式谓词 是的等式两边分别是两行,即 (E1, ..., En) = (E'1, ..., E'n)
,例如 (1, 2, 3) = (2, 3, 4)
。
行等式谓词 中存在嵌套关系,显然不方便于计算,在优化过程中,需要将行的每一对元素拆分为一个 简单等式谓词。我们将这样一组相互之间为 AND
关系的 简单等式谓词 称为 常规联合等式:
常规联合等式(conjunctive regular equality) 常规联合等式,是指由 AND
连接的一组 简单等式谓词,例如 a = b AND c = d AND e = f
。
然而,常规联合等式 中的 简单等式谓词 也无法充分表达出字段和常量相互之间的关系。例如,当查询条件为 a = b AND b = c AND c = 4
时,我们会得到 a = b
、b = c
和 c = 4
这 3 个相互独立的 简单等式谓词,无法表示出其中隐含的 a = c
、a = 4
、b = 4
等条件,不便于选择索引和执行查询。
此时,我们需要引入 多重等式谓词,将 a = b AND b = c AND c = 4
转化为类似 a = b = c = 4
的形式,从而使其中隐含的等式条件可以被利用。
多重等式谓词(multiple equalities predicate, MEP) 多重等式谓词 写作 =(f1, ..., fn)
,表示其中的每个元素之间都是相等的,即等价于 f1 = f2 AND ... AND fn-1 = fn
。在这些元素中,可以包含若干个字段以及零个或一个常量。
通过 多重等式谓词,我们可以将每一组等式条件合并到一起,从而方便索引选择和查询。