select
(SELECT GROUP_CONCAT(dFollowUperName separator ',') FROM t_follow_upinfo where dFollowUpID='660434823409577984' and dCustomerID = A.dID) as kcgwUper, (SELECT GROUP_CONCAT(dFollowUperName separator ',') FROM t_follow_upinfo where dFollowUpID='660435009510846464' and dCustomerID = A.dID) as scUper, (SELECT dNextDate FROM t_follow_upinfo where dCustomerID = A.dID order by dNextDate DESC limit 1) as dLastFollowDate, (SELECT dNextMode FROM t_follow_upinfo where dCustomerID = A.dID order by dNextDate DESC limit 1) as dLastFollowType from t_customer_info A order by A.dCreateTime desc limit 1000 以上查询,一次查询1000条耗时 20秒 左右。 主要耗时是嵌套了四个子查询,而且查的都是同一张表(t_follow_upinfo),只是查询字段不同。主表(t_customer_info)和子表(t_follow_upinfo)的数据都在1W条左右。 求助大佬一起优化!!! ========================================================== 1、用left join代替所有子查询 left join ( SELECT GROUP_CONCAT(f.dFollowUperName separator ',') ,f.dCustomerID,column1, column2 from t_follow_upinfo f group by f.dCustomerID ) temp1 on a.dID = temp1.dCustomerID 2、建立索引,使用explain查看索引是否命中 3、为排序字段(dCreateTime)添加强制索引指令 ... from t_customer_info A force index(index_createtime) mysql优化器会计算出一个合适的索引,但是这个索引不一定是最好的。force index()指令可以避免MySql优化器用到了一个低效的索引。 最终优化到4s左右。。。 [sky丶斌于2020-01-17 10:56编辑了帖子]
|
|
沙发#
发布于:2020-02-13 10:40
使用联接代替子查询,好主意
force index没有用过,哈哈,学习到了,谢谢楼主的分享 |
|
|
板凳#
发布于:2020-01-16 10:54
写存储过程,把查出来的值存在变量中,不要直接套在子程序中,不然没有都要跟着执行
|
|
|