mysql left join 超慢, 看代码

panmingguang 发布于 2013/05/23 16:25
阅读 2K+
收藏 1
索引 已加, left join 里层的语句 执行都不超过 150 毫秒,  记录条数 3000条.  是不是 结果集 的表不能使用索引


select a.* from (

select a.F_SoftId f_id,a.F_SName name ,a.F_StId typeid,a.F_SVersion version,b.F_StName 
from t_localsoft a, t_softtype b where a.F_StId= b.F_StId )a 
left join (select a.F_SoftId,GROUP_CONCAT(b.F_DeptName) dnames ,GROUP_CONCAT(b.f_deptid) dids from 
t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId group by a.F_SoftId )b 
on a.f_id = b.F_SoftId left join 

(select a.F_SoftId,GROUP_CONCAT(b.F_DeptName) fnames,GROUP_CONCAT(b.f_deptid) fids from 
t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId and a.F_Force=1 group by a.F_SoftId ) c 
on a.f_id = c.F_Softid where 1=1


以下是问题补充:

@panmingguang:table type possible_keys [NULL] [NULL] [NULL] <derived3> ALL [NULL] <derived4> ALL [NULL] <derived5> ALL [NULL] b ALL PRIMARY a ref FK_T_DEPTSO_REFERENCE_T_DEPART22 b ALL PRIMARY a ref FK_T_DEPTSO_REFERENCE_T_DEPART22 a ALL FK_Reference_6 b eq_ref PRIMARY (2013/05/23 16:29)
加载中
0
红薯
红薯
EXPLAIN 看看情况,检查索引等等
0
panmingguang
panmingguang

没发图,  EXPLAIN  有三个结果集, rows 2743, 

table--><derived3>  

type-->ALL
应该就是结果集 的, 没有任何索引

0
桔子
桔子
干嘛要子查询
0
panmingguang
panmingguang


select a.* from (
	select a.F_SoftId f_id,a.F_SName name ,a.F_StId typeid,a.F_SVersion version,b.F_StName 
	from t_localsoft a, t_softtype b where a.F_StId= b.F_StId 
)a left join 
	t_deptsoft b on a.f_id = b.F_SoftId

128毫秒


select a.* from (
	select a.F_SoftId f_id,a.F_SName name ,a.F_StId typeid,a.F_SVersion version,b.F_StName 
	from t_localsoft a, t_softtype b where a.F_StId= b.F_StId 
)a left join 
	(select * from t_deptsoft)b
on a.f_id = b.F_SoftId
超过 10秒?????

0
panmingguang
panmingguang
@桔子 要group by 么, 拿到外面 倒是快了不少
0
cat_old
cat_old

group by 换成 


select * from
   t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId and a.F_Force=1 group bya.F_SoftId )
改成



select distinctF_SoftId a.F_SoftId,GROUP_CONCAT(b.F_DeptName) fnames,GROUP_CONCAT(b.f_deptid) fids from
10 t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId and a.F_Force=1  )


0
cat_old
cat_old

引用来自“cat_old”的答案

group by 换成 


select * from
   t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId and a.F_Force=1 group bya.F_SoftId )
改成



select distinctF_SoftId a.F_SoftId,GROUP_CONCAT(b.F_DeptName) fnames,GROUP_CONCAT(b.f_deptid) fids from
10 t_deptsoft a ,t_dept b where a.F_DeptId = b.F_DeptId and a.F_Force=1  )


额 把group by xx  换成 distinct xx 

0
panmingguang
panmingguang
换 distinct 我怎么 汇总啊
0
panmingguang
panmingguang
有办法了, 只能 多关联 几次表, 不要子查询 ,最后在 group by 这样应该会好
0
panmingguang
panmingguang

完成

select a.*, GROUP_CONCAT(d.F_deptid) from (
	select a.*, GROUP_CONCAT(b.F_deptid) from (
		select a.F_SoftId f_id,a.F_SName name ,a.F_StId typeid,a.F_SVersion version,b.F_StName 
		from t_localsoft a, t_softtype b where a.F_StId= b.F_StId 
	)a left join 
		t_deptsoft b on a.f_id = b.F_SoftId group by a.f_id
)a left join 
t_deptsoft d on a.f_id = d.F_SoftId and  d.F_Force=1 group by  a.f_id

返回顶部
顶部