sky丶斌
骑士
骑士
  • 最后登录2022-06-28
  • 发帖数29
阅读:6469回复:2

[mysql]mysql子查询如何优化?

楼主#
更多 发布于:2020-01-13 17:53
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编辑了帖子]
doubleyong
管理员
管理员
  • 最后登录2025-03-16
  • 发帖数1196
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
沙发#
发布于:2020-02-13 10:40
使用联接代替子查询,好主意
force index没有用过,哈哈,学习到了,谢谢楼主的分享
知识需要管理,知识需要分享
doubleyong
管理员
管理员
  • 最后登录2025-03-16
  • 发帖数1196
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
板凳#
发布于:2020-01-16 10:54
写存储过程,把查出来的值存在变量中,不要直接套在子程序中,不然没有都要跟着执行
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号