记录一下 一个复杂SQL的执行效率分析
SQL: 通过getlastSQL 获取到SQL
SELECT a.id as aid,`a`.`username`,`a`.`phone`,a.college as a_college,a.school as a_school,a.major as a_major,
`a`.`area_id`,`a`.`teach_center_id`,`a`.`class_id`,a.teacher_id as ateacher_id,`a`.`year`,`a`.`product_type_id`,
`a`.`choose_status`,`a`.`equip_status`,`b`.*,`c`.`special_change_num`,`c`.`apply_status`,c.operator as c_operator,
c.create_time as c_create_time,c.id as cid,`c`.`applicant`,`c`.`special_teacher_id`,`c`.`apply_area_id`,`c`.`out_money`,
c.update_time as c_update_time,c.check_remark as c_check_remark,s.username as sp_name,s.area_id as sp_area_id,
m.name as follow_teacher,`n`.`equip_area_id`,`n`.`equip_manager`,n.operator as mark_operator,`n`.`operator_area`,
`n`.`assign_type`,n.remark as mark_remark,`n`.`equip_area_ids_list`,`n`.`is_all_area`,`n`.`sign_service`,
`n`.`sign_service_hours`,n.create_time as mark_create_time
FROM `choose_school` `b`
LEFT JOIN `student` `a` ON `a`.`crm_student_id`=`b`.`crm_student_id`
LEFT JOIN `equip_new` `c` ON `b`.`student_id`=c.student_id and a.equip_status = c.apply_status
LEFT JOIN `special_teacher_new` `s` ON `s`.`id`=`c`.`special_teacher_id`
LEFT JOIN `special_manager` `m` ON `b`.`follow_teacher`=`m`.`id`
LEFT JOIN `no_sp_record` `n` ON `n`.`crm_id`=`b`.`crm_student_id`
WHERE `b`.`status` = '1' AND `a`.`status` = '1' AND `a`.`service_status` = '1'
AND `a`.`choose_status` = '1' AND ( `a`.`area_id` in (1,36) or FIND_IN_SET(1,n.equip_area_ids_list) or n.is_all_area=1 )
AND ( `a`.`area_id` in (1,36) or FIND_IN_SET(36,n.equip_area_ids_list) or n.is_all_area=1 )
GROUP BY `b`.`crm_student_id` ORDER BY `a`.`equip_status` ASC,`b`.`write_time` DESC,`a`.`update_time` DESC
LIMIT 0,10
6个表联查数据,条件异常复杂;
主要负责点在于 where 条件的组装和拼接;不同的where 逻辑 ,and 或 or ;
因为执行速度极慢,两条数据需要大概120秒;
Explain 分析发现 两个大表均 是全表扫描;未走索引;
一个一个字段排查,发现遗漏索引的列;添加后:
速度明显提升;
分析原因:随着系统越来越 庞大后,表设计字段也越来越多, 维护起来可能就比较麻烦,系统响应速度慢,就需要具体问题,一步一步排查;
技巧:可以试着一步一步的先去掉 leftjoin 去掉where 去掉排序,一个个的添加和排查,这样更方便排查问题所在;
文章来源:刘俊涛的博客 欢迎关注公众号、留言、评论,一起学习。
__________________________________________________________________________________
若有帮助到您,欢迎点击推荐,您的支持是对我坚持最好的肯定(*^_^*)
原文地址:https://www.cnblogs.com/lovebing/p/15010596.html
- 利用Fck的javascript-API创建fck编辑器
- ASPNET_WEBAPI快速学习02
- ExtJs学习笔记(17)_table布局
- Markdown快速入门
- JavaScript之apply()和call()的区别
- JavaScript之面向对象学习八(继承)
- JQuery快速入门
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
- ExtJs学习笔记(16)_Form布局
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
- 未来几年苹果公司很可能“不务正业”,进军汽车无人驾驶界
- ExtJs学习笔记(15)_fit布局
- JavaScript之call()和apply()方法详解
- Javascript快速入门(下篇)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R-tmap 绘制带指北针和比例尺的空间地图
- 升级Php Curl扩展遇到的坑
- Skywalking Php注册不上问题排查
- 接口403问题没这么容易解决
- 码云 Pages 搭建
- Meteva笔记:加载GRIB 2要素场
- crontab 指令笔记
- Shell 脚本实现串口操作
- 【CSS】714- 你所不知道的 CSS 负值技巧与细节
- SRC挖掘利器—溯光开源插件化渗透测试框架
- 【React】717- 从零实现 React-Redux
- 【Vue.js】Vue.js介绍及MVVM模式
- 【Vue.js】Vue.js基本语法
- 【JS】723- 前端如何优雅的处理类数组对象?
- GitLabCI作业中如何使用私有仓库镜像?