nested loop和filter的区别

 我来答
爱可生云数据库
2021-03-23 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部
这种是 MySQL 里最简单、最容易理解的表关联算法。
比如,拿语句 select * from p1 join p2 using(r1) 来说,
先从表 p1 里拿出来一条记录 ROW1,完了再用 ROW1 遍历表 p2 里的每一条记录,并且字段 r1 来做匹配是否相同,以便输出;再次循环刚才的过程,直到两表的记录数对比完成为止。
那看下实际 SQL 的执行计划,
mysql> explain format=json select * from p1 inner join p2 as b using(r1)\G*************************** 1. row ***************************EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "1003179606.87" }, "nested_loop": [ { "table": { "table_name": "b", "access_type": "ALL", "rows_examined_per_scan": 1000, "rows_produced_per_join": 1000, "filtered": "100.00", "cost_info": { "read_cost": "1.00", "eval_cost": "100.00", "prefix_cost": "101.00", "data_read_per_join": "15K" }, "used_columns": [ "id", "r1", "r2" ] } }, { "table": { "table_name": "p1", "access_type": "ALL", "rows_examined_per_scan": 9979810, "rows_produced_per_join": 997981014, "filtered": "10.00", "cost_info": { "read_cost": "5198505.87", "eval_cost": "99798101.49", "prefix_cost": "1003179606.87", "data_read_per_join": "14G" }, "used_columns": [ "id", "r1", "r2" ], "attached_condition": "(`ytt_new`.`p1`.`r1` = `ytt_new`.`b`.`r1`)" } } ] }}1 row in set, 1 warning (0.00 sec)

从上面的执行计划来看,表 p2 为第一张表(驱动表或者叫外表),第二张表为 p1,那 p2 需要遍历的记录数为 1000,同时 p1 需要遍历的记录数大概 1000W 条,那这条 SQL 要执行完成,就得对表 p1(内表)匹配 1000 次,对应的 read_cost 为 5198505.87。那如何才能减少表 p1 的匹配次数呢?那这个时候 JOIN BUFFER 就派上用处了
Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
huanglenzhi
推荐于2016-09-04 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517201
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
filter 和 nest
loop的区别

SQL> select a.ename,a.deptno from emp a,dept b where
a.deptno=b.deptno;

Execution
Plan
----------------------------------------------------------
0 SELECT
STATEMENT Optimizer=CHOOSE (Cost=5 Card=1526 Bytes=30
520)
1 0 NESTED
LOOPS (Cost=5 Card=1526 Bytes=30520)
2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2
Card=14 Bytes=98)
3 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=327
Bytes=425
1)

SQL> select a.ename,a.deptno from emp a where
a.deptno=(select b.deptno from dept b where b.deptno=a.deptno);
0 SELECT
STATEMENT Optimizer=CHOOSE (Cost=12 Card=5 Bytes=35)
1 0 FILTER
2 1 TABLE
ACCESS (FULL) OF 'EMP' (Cost=2 Card=5 Bytes=35)
3 1 TABLE ACCESS (FULL) OF
'DEPT' (Cost=2 Card=3 Bytes=39)

就拿你的例子来说, 第一种情况nested loop 时,
首先全表扫描emp 表,对于返回的每一条记录,然后全表扫描 dept 表, 找出 a.deptno=b.deptno 的记录;重复这一过程,直到 对于emp
表中的每条返回记录,都 通过 a.deptno=b.deptno 去访问了 dept 表. nest loop 可以看成是一个for
循环.

第二种 是filter , 这个计划是说,分别全表扫描 emp 表和 dept 表,然后对于这两个结果集求 笛卡尔集,最后再通过
条件来过滤出最终满足条件的结果集, 至于条件是什么,当然就是 a.deptno=b.deptno

filter是一种操作,累死Order BY
Nested
Loop是Join的一种
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式