MySQL 的子查询和left join的比较,什么时候用子查询效率高,什么时候用left join效率高?

作者&投稿:藏米 (若有异议请与网页底部的电邮联系)
~

子查询优化策略

对于不同类型的子查询,优化器会选择不同的策略。

1. 对于 IN、=ANY 子查询,优化器有如下策略选择:

  • semijoin

  • Materialization

  • exists

  • 2. 对于 NOT IN、<>ALL 子查询,优化器有如下策略选择:

  • Materialization

  • exists

  • 3. 对于 derived 派生表,优化器有如下策略选择:

  • derived_merge,将派生表合并到外部查询中(5.7 引入 );

  • 将派生表物化为内部临时表,再用于外部查询。

  • 注意:update 和 delete 语句中子查询不能使用 semijoin、materialization 优化策略



使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。
子查询虽然很灵活,但是执行效率并不高。

可以使用JOIN、LEFT JOIN等方式代替子查询,这些方式不需要建立临时表,因此速度比子查询快。


滴道区15012466451: mysql left join 会影响数据库性能吗 -
丙秦参芍: left join 的效率没有 inner join的效率高,可是这个要根据实际情况来采用的

滴道区15012466451: MySQL left join 与 sub query 子查询是否有区别 -
丙秦参芍: 表a 记录 有a1 a2表b 记录 a1普通的 之 普通的知显示 a1a left join b 会显示 a1 a2 left join 2个表 即使 左边的那个表里有 而右边的表里没有 也显示出来

滴道区15012466451: 有哪些常见的mysql子查询 -
丙秦参芍: 我做了测试(select admin_type from cool_admin where admin_name ='admin')的结果是id 但是select (select admin_type from cool_admin where admin_name ='admin') from `tk_team` left join tk_user using(id)的结果为: select id from `tk_team` left join tk_user using(id) 的结果为: 是有点费解,结果数相同,但是查询结果不一样,说明mysql还是不支持值得传递

滴道区15012466451: 用mysql实现多项子查询 -
丙秦参芍: SELECT 名字,count(日期) as 次数 from 表 group by 名字,日期

滴道区15012466451: leftjoin和子查询哪个效率高 -
丙秦参芍: leftjoin和子查询哪个效率高 right join 和 left join 是一致的,不过表的顺序不同而已. 第二个,说明部分子查询 是和 inner join 等效的.

滴道区15012466451: “mysql ”多表联合查询语句怎么写? -
丙秦参芍: 一使用SELECT子句进行多表查询SELECT 字段名 FROM 表1,表2 … WHERE 表1字段 = 表2字段 AND 其它查询条件SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a....

滴道区15012466451: mysql left join 可以不写on吗 -
丙秦参芍: mysq不能嵌套select的子查询.所以我把子查询建成了视图b,主查询通过left join on关联视图b ,形成视图a.由于视图b中也有left join , 通过left join 关联表c .通过c确定视图b中的字段state.如果c中有数据,则state=1,否则为0.然后,在视图a中,取state的值,计算结果.

滴道区15012466451: mysql 多次查询 子查询 那个效率高? -
丙秦参芍: 涉及的表比较少的,业务逻辑不是很麻烦的,用子查询应该快一些 涉及业务逻辑很复杂的,用多次查询会好一点

滴道区15012466451: SQL子查询 -
丙秦参芍: with a as( select a.id id1,b.id id2,c.id id3,a.shuiguoid,b.name name2 ,c.name name3 ,charindex(','+cast(b.id as varchar(10))+',',','+a.shuiguoid+',') ind1,charindex(','+cast(c.id as varchar(10))+',',','+a.shuiguoid+',') ind2 from jieguo a,shuiguo b,shuiguo c...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网