left join的执行原理是什么?

哎呦喂哈 2011-07-01 03:03:57
我写了条left join语句 执行速度很慢,他的执行原理是什么?有什么优化的方法吗?
还有inner join 是什么意思?执行速度很快嘛?
...全文
774 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
l5854537x 2011-07-02
  • 打赏
  • 举报
回复
这个效率很低
  • 打赏
  • 举报
回复
问数据库问题,在问问题之前请:

1:列出所使用的 DBMS
2:列出所有相关表的表结构
3:列出所有相关表的索引
4:列出所有相关表大致的数据行数
5:列出需要提问的 SQL 语句

如果做不到的话,我敢保证你得不到满意的答复。
kurama_mail 2011-07-01
  • 打赏
  • 举报
回复
数据库主键本身就是索引,查询多针对主键的有效索引来查询减少结果集再进行左联或右联.因为左联或右联不是先组成笛卡儿结果集,会分别检索左右表全记录.
对索引不熟悉就针对主键查询就好了.
哎呦喂哈 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kurama_mail 的回复:]
left join 你任意一边结果集很大一样会慢.
[/Quote]
这种情况应该怎么处理呢?
哎呦喂哈 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kurama_mail 的回复:]
left join 想要加速就同时减少join2边的表结果集,实现原理自己百度去.
一般速度慢多半是索引无法使用.
[/Quote]
好像我没建索引,索引应该怎么建啊?
不要笑我,我菜鸟,刚出校门……
kurama_mail 2011-07-01
  • 打赏
  • 举报
回复
left join 你任意一边结果集很大一样会慢.
kurama_mail 2011-07-01
  • 打赏
  • 举报
回复
left join 想要加速就同时减少join2边的表结果集,实现原理自己百度去.
一般速度慢多半是索引无法使用.
数字巫师 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 caolong0210 的回复:]

引用 2 楼 alexsand 的回复:
比如 select A.*,B.* from A left join B on b.aid = a.id

数据库先取得 A表全部数据,再根据 b.aid = a.id 取得 b表相关数据
然后拼接组装出 A.*,B.*的合成数据并返回

个人认为left join 写的好的话并不会特别慢。即不要在left join 中用大量复杂的关联子查询……
[/Quote]

没有特别好的办法,如果实在要用的话,就要尽量想办法缩小子查询的数据集,多加where条件
哎呦喂哈 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 angelhaoweiguang 的回复:]
引用 3 楼 caolong0210 的回复:
引用 1 楼 friendxxy 的回复:
left join 左连接 如果是单纯两表left join的话,这种在结构上一般不优化 主要是看看索引了 速度慢说明你表很大嘛
select * from tablea a inner join tableb b on a.id=b.aid 就相当于 select * from tablea a,t……
[/Quote]
英语就适合全世界,中国语适合全宇宙--这句话说的好啊
哎呦喂哈 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 alexsand 的回复:]
比如 select A.*,B.* from A left join B on b.aid = a.id

数据库先取得 A表全部数据,再根据 b.aid = a.id 取得 b表相关数据
然后拼接组装出 A.*,B.*的合成数据并返回

个人认为left join 写的好的话并不会特别慢。即不要在left join 中用大量复杂的关联子查询
比如:
select A.*,t.* f……
[/Quote]
我写的sql是必须要在left join中用大量的关联子查询的,有没有什么优化的方法
Angelhaoweiguang 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 caolong0210 的回复:]
引用 1 楼 friendxxy 的回复:
left join 左连接 如果是单纯两表left join的话,这种在结构上一般不优化 主要是看看索引了 速度慢说明你表很大嘛
select * from tablea a inner join tableb b on a.id=b.aid 就相当于 select * from tablea a,tableb b where a.id=b.aid
……
[/Quote]
没什么区别,写法不一样,后者更利于扩展和移植,因为有的数据库是不支持inner join的
前者好比是英语,后者好比是中国语
英语就适合全世界,中国语适合全宇宙
哎呦喂哈 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 friendxxy 的回复:]
left join 左连接 如果是单纯两表left join的话,这种在结构上一般不优化 主要是看看索引了 速度慢说明你表很大嘛
select * from tablea a inner join tableb b on a.id=b.aid 就相当于 select * from tablea a,tableb b where a.id=b.aid
[/Quote]

select * from tablea a inner join tableb b on a.id=b.aid 就相当于 select * from tablea a,tableb b where a.id=b.aid
这两个有什么区别没有,执行速度怎样?
数字巫师 2011-07-01
  • 打赏
  • 举报
回复
比如 select A.*,B.* from A left join B on b.aid = a.id

数据库先取得 A表全部数据,再根据 b.aid = a.id 取得 b表相关数据
然后拼接组装出 A.*,B.*的合成数据并返回

个人认为left join 写的好的话并不会特别慢。即不要在left join 中用大量复杂的关联子查询
比如:
select A.*,t.* from A
left join (
select B.* from B
) t on t.aid = a.id
这样的话,必然里面是一个全表的数据返回,就很影响效率了
xxy8100 2011-07-01
  • 打赏
  • 举报
回复
left join 左连接 如果是单纯两表left join的话,这种在结构上一般不优化 主要是看看索引了 速度慢说明你表很大嘛
select * from tablea a inner join tableb b on a.id=b.aid 就相当于 select * from tablea a,tableb b where a.id=b.aid

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧