使用left join比直接使用where速度快的原因

多表使用left join只是把主表里的所有数据查询出来,其他表只查询表中的符合条件的某一条记录,所以速度非常快;而多表使用where内联,是把所有表的数据全查出来,然后进行比对,所以速度非常慢。

使用left join要注意确定哪一张表是主表,如果无法确定主表,则选择哪张表查询的字段最多,就把哪张表作为主表。

示例如下:

使用left join,同样的数据量,时间不到1秒钟!

SELECT a.projectno,MAX(a.projectname) projectname,max(a.projectMoney) projectMoney,
max(a.projectLimitYear) projectLimitYear,max(a.monthcharge) monthcharge,
max(c.orgname) orgname,max(d.businesstypename) businesstypename,max(e.name) name,
max(b.dicvalue) dicvalue,
min(CONVERT(varchar(100),DATEADD("DAY",jbl.DelayDays,jbl.ReportTime),23)) as period,
max(f.fiveleveltype) fiveleveltype,max(a.ProjectInfoId) ProjectInfoId,
max(g.FlowRunId) FlowRunId
FROM
(select ProjectInfoId,ProjectNo,Status,OrgId,TypeID,UserAId,IsDelete,ProjectName,ProjectMoney,ProjectLimitYear,MonthCharge from jt_biz_projectinfo) a
LEFT JOIN
(select b.* from (select MAX(id) id, ProjectNo from JT_Biz_Lecture group by ProjectNo) a,
JT_Biz_Lecture b where a.id=b.id) f
on a.projectno=f.projectno
LEFT JOIN
(select DicId,IsDelete,DicValue,DicCode from jt_Base_Dictionary) b
ON a.status=b.dicId
LEFT JOIN
(select ProjectNo,DelayDays,ReportTime from Jt_Biz_LectureTemp) jbl
ON a.projectno=jbl.projectno
LEFT JOIN
(select IsDelete,OrgName,OrgId from jt_base_org) c
ON a.orgid=c.orgid
LEFT JOIN
(select ID,BusinessTypeName from d_businesstype) d
ON a.typeid=d.id
LEFT JOIN
(select UserInfoId,IsDelete,Name,UserName from jt_base_userInfo) e
ON a.useraid=e.userinfoid
LEFT JOIN
(select UserId,PostId,OrgIds from JT_Base_Post_UserOrg) j
ON j.UserId=e.userinfoid
LEFT JOIN
(select PostId from JT_Base_Post) k
ON j.PostId=k.PostId
LEFT JOIN
(select FlowRunId,ProjectId from jt_flow_run) g
ON a.ProjectInfoId=g.ProjectId
LEFT JOIN
(select FlowRunId from JT_Flow_Run_Prcs) h
ON g.FlowRunId = h.FlowRunId
LEFT JOIN
(select OrgId,OrgName from JT_Base_Org) l
ON a.OrgId=l.OrgId
WHERE a.status in(82,83,84) and a.isdelete=0
and b.isdelete=0 and c.isdelete=0 and e.isdelete=0
and (l.OrgId in(null) or e.UserName=‘chenqf‘) group by a.ProjectNo;
--加快查询速度之对比

不使用left join,同样数据量,时间大概在50秒的样子!
select a.projectno,max(a.projectname) projectname,max(a.projectMoney) projectMoney,
max(a.projectLimitYear) projectLimitYear,max(a.monthcharge) monthcharge,
max(c.orgname) orgname,max(d.businesstypename) businesstypename,max(e.name) name,
max(b.dicvalue) dicvalue,
min(CONVERT(varchar(100),DATEADD("DAY",jbl.DelayDays,jbl.ReportTime),23)) as period,
max(f.fiveleveltype) fiveleveltype,max(a.ProjectInfoId) ProjectInfoId,
max(g.FlowRunId) FlowRunId
from (select DicId,IsDelete,DicValue,DicCode from jt_Base_Dictionary) b,
(select IsDelete,OrgName,OrgId from jt_base_org) c,
(select UserInfoId,IsDelete,Name,UserName from jt_base_userInfo) e,
(select ID,BusinessTypeName from d_businesstype) d,
(select FlowRunId,ProjectId from jt_flow_run) g,
(select FlowRunId from JT_Flow_Run_Prcs) h,
(select UserId,PostId,OrgIds from JT_Base_Post_UserOrg) j,
(select PostId from JT_Base_Post) k,
(select OrgId,OrgName from JT_Base_Org) l,
(select ProjectNo,DelayDays,ReportTime from Jt_Biz_LectureTemp) jbl,
(select ProjectInfoId,ProjectNo,Status,OrgId,TypeID,UserAId,IsDelete,ProjectName,ProjectMoney,ProjectLimitYear,MonthCharge from jt_biz_projectinfo) a
left join
(select b.* from (select MAX(id) id, ProjectNo from JT_Biz_Lecture group by ProjectNo) a,
JT_Biz_Lecture b where a.id=b.id) f
on a.projectno=f.projectno where a.status=b.dicId and a.status in(82,83,84)
and a.projectno=jbl.projectno and a.orgid=c.orgid and a.typeid=d.id
and a.useraid=e.userinfoid and j.UserId=e.userinfoid and a.isdelete=0
and b.isdelete=0 and c.isdelete=0 and e.isdelete=0 and g.FlowRunId = h.FlowRunId 
and (l.OrgId in(null) or e.UserName=‘chenqf‘)
group by a.ProjectNo;

时间: 2024-07-30 03:23:52

使用left join比直接使用where速度快的原因的相关文章

kafka速度快的原因

我们都知道Kafka非常快,比绝大多数的市场上其他消息中间件都要快.这里来研究下那么为什么Kafka那么快(当然不会是因为它用了Scala). Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间. 但是实际上,Kafka其中一个特性却是高吞吐率,即使是普通的服务器,Kafka也能轻松支持每秒百万级的写入请求,超过了大部分的消息中间件.这种特性使得Kafka在日志处理等海量数据场景中应用广泛.那么为什么Kafka速度那么快,可以从数据写入和数据读

mysql 如何优化left join

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_original c left join hotel_info_collection h on c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_id where h.hotel_id is null 这个sql是用来查询出c表中有h表中无的记录,所

java多线程16:join()的使用

讲解join()方法之前请确保对于即wait()/notify()/notifyAll()机制已熟练掌握.可以参考前面的笔记 join()方法的作用是等待线程销毁.join()方法反应的是一个很现实的问题,比如main线程的执行时间是1s,子线程的执行时间是10s,但是主线程依赖子线程执行完的结果,这时怎么办?可以像生产者/消费者模型一样,搞一个缓冲区,子线程执行完把数据放在缓冲区中,通知main线程,main线程去拿,这样就不会浪费main线程的时间了.另外一种方法,就是join()了. jo

(三)(2)wait/notify实现生产者-消费者模型,join方法

生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员扮演消费者. 一句话说:生产者没有生产出来东西,消费者就必须等待着,生产者生产出来了,就通知消费者进行消费. 很明显,消费者等待就对应我们的wait方法,生产者通知消费者对应notify方法,所以,生产者,消费者模型可以用notify,wait来实现. 那么与之对应的,生产者不可能只有一个,消费者也

开源大数据处理系统/工具大全

本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考.下面是第一部分. 查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的J

Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它.比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰,见代码 /* Java thread status for tools, * initialized to indicate thread 'not yet started' */   p

1Z0-051-DDL-1表和临时表的创建和使用

一.创建简单表 1.1  使用列规范创建表 语法: CREATETABLE [schema.]tablename [ORGANIZATION HEAP] (columndatatype [default expression] [,columndatatype [default expression]] ); 注:DEFAULT 字句可能很有用,但它功能很有限. 分析以下案例: CREATETABLE SCOTT.EMP (EMPNONUMBER(4), ENAMEVARCHAR2(10), H

大数据工具集详

查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的JDBC结果集.直接使用HBase API.协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒. Ph

(转)一共81个,开源大数据处理工具汇总

[思路网注] 本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考. 本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考.下面是第一部分. 查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHu