MySQL在处理join查询时,遍历驱动表的记录,把驱动表的记录传递给被驱动表,然后根据join连接条件进行匹配。优化器通常会将更小的表作为驱动表,通过在驱动表上做额外的where条件过滤(Condition Filtering),能够将驱动表限制在一个更小的范围,以便优化器能够做出更优的执行计划。
原文地址:
https://mytecdb.com/blogDetail.php?id=98
1. 什么是条件过滤(Condition Filtering)
如果没有使用条件过滤,join查询的驱动表预估扫描的记录数与索引条件相关,比如一个二级索引 idx_name(name),name=‘abc’ 的记录数有100个,那么执行计划中的预估扫描记录数就是100左右。如果此时where条件中关于驱动表有另外一个条件限制,比如age=20,满足name='abc’且age=20的记录数为10,通过条件过滤后,实际参与到join运算的驱动表记录数只有10条左右。
条件过滤有一些限制:
- 条件只能是常量
- 条件过滤中的where条件不在索引条件中
2. 条件过滤在explain中的表现
在explain的输出中,rows字段表示所选择的索引访问方式预估的扫描记录数,filtered字段反映了条件过滤,filtered值是一个百分比,最大