免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4006 | 回复: 6
打印 上一主题 下一主题

【讨论中】关于mysql join的连接原理.求解惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-03 03:32 |只看该作者 |倒序浏览
本帖最后由 chinafenghao 于 2013-03-04 09:01 编辑

话不多说,直接求教.

之前我在一本书上看到了mysql执行计划的说明(忘记是哪本书了,mysql开发者SQL权威指南或MYSQL技术内幕:SQL编程,因为书不在身边,无法确认,见谅!).
大概意思就是,当对两个表进行联合查询的时候,会首先把两个表进行一次值积的计算,把这个集合存进一个VT内.然后通过他们的链接条件,过滤成一额新的VT。然后再执行其他子句,例如WHERE.通过WHERE子句,在形成一个VT,然后再次执行其他子句,例如LIMIT.
以下是例子:
select * from a left b join on a.id = b.a_id where a.name = 'name' limit 0,3;

1.对a和b进行笛卡尔积计算,形成一个VT1
2.对VT1进行a.id = b.a_id过滤,形成VT2
3.对VT2进行a.name = 'name'过滤,形成VT3
4.对VT3进行LIMIT 过滤,形成VT4
5.返回VT4


然后,晚上看到了简朝阳先生的blog,他对这个过程有另外一个的说法

1.先对a.name = 'name'过滤,形成VT1
2.用VT1的数据,循环和b进行ON条件对比
3.进行LIMIT
4.返回

请问,哪个说法才是合适的呢?
虽然个人比较愿意相信第二个说法,因为相对来说,效率会高很多.但是两个都是权威人士的说法.求各位指点一二.


另,个人认为,两个说法对是否使用子查询,有很大的影响,例如
select * from a,(select * from b where age > 30) as c where a.id = c.a_id;

上面用到了子查询,子查询是通过建立一个临时表来进行的.
如果join原理是第一种说法的话,那么上面这个子查询将比使用inner join更合理。
因为先通过子查询,缩小了联表的集合范围,这样将会减小笛卡尔积,提高查询效率

可是,如果是第二种说法的话,因为子查询使用了临时表,这样将会比inner join的效率低。

新人掘见.再次恳求指点.

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [报告]
发表于 2013-03-03 08:47 |只看该作者
我觉得是第一种正确,MySQL技术内幕SQL编程这本书有介绍

论坛徽章:
0
3 [报告]
发表于 2013-03-03 12:04 |只看该作者
回复 2# bikong0411


    如果是第一种说法正确的话,那对于子查询应该比join更有效率啊.因为子查询直接降低到了笛卡尔积,但是为什么大家都更推荐join呢?

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
4 [报告]
发表于 2013-03-04 09:01 |只看该作者
@xgr_xgr
第一个流程是标准流程
第二个流程可能是优化器优化以后的流程,这个就要看你的索引了。

论坛徽章:
0
5 [报告]
发表于 2013-03-04 09:47 |只看该作者
@chinafenghao

理解鸟.谢谢.

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
6 [报告]
发表于 2013-03-04 09:50 |只看该作者
智能mysqllol

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
7 [报告]
发表于 2013-03-04 10:14 |只看该作者
将计划一转变为计划二就是SQL优化器的主要任务
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP