条件过滤
在联接处理中,前缀行是从联接中的一个表传递到下一个表的那些行。通常,优化程序会尝试在连接顺序的早期放置前缀计数较低的表,以防止行组合的数量迅速增加。在某种程度上,优化器可以使用有关从一个表中选择并传递到下一个表的行的条件的信息,它可以更准确地计算行估计并选择最佳执行计划。
如果不使用条件过滤,则表的前缀行数将WHERE
根据优化器选择的访问方法,根据子句选择的估计行数进行计算 。条件过滤使优化器可以WHERE
在访问方法未考虑的子句中使用其他相关条件 ,从而改善其前缀行数估计。例如,即使可能存在基于索引的访问方法,该方法可用于从联接中的当前表中选择行,但对于表中的表,也可能存在其他条件。WHERE
子句可以过滤(进一步限制)传递给下一张表的合格行的估计值。
仅在以下情况下,条件才有助于过滤估计:
- 它引用当前表。
- 它取决于连接序列中一个或多个常量值。
- 访问方法尚未考虑它。
在EXPLAIN
输出中,该 rows
列指示所选访问方法的行估计,该filtered
列反映条件过滤的效果。 filtered
值以百分比表示。最大值为100,这表示未过滤行。值从100减小表示过滤量增加。
前缀行数(估计从当前表通过联接传递到下一个表的行数)是rows
和 filtered
值的乘积。即,前缀行数是估计的行数,该估计的行数由于估计的滤波效果而减少。例如,如果rows
为1000且filtered
为20%,则条件过滤会将估算的行数1000减少为前缀行数1000×20%= 1000×.2 = 200。
考虑以下查询:
SELECT *
FROM employee JOIN department ON employee.dept_no