sql相关子查询的一个小知识点
2016-11-16 23:22
253 查看
最近遇到一个耗时很长的sql,如下
一开始我以为是因为索引没有添加,但是查看后发现连接字段都有索引,继续分析,我explain这句sql出来一看,终于找到问题
问题出在这里
这里这句相关子查询依赖于外部查询,也就是外部查询执行一行,子查询就执行一次。假如只是如此也没啥问题,添加索引仍能使它变快,但是在这里连接部分使用了自定义函数,这就导致了mysql将不会使用索引而全表查询。导致查询异常的缓慢。甚至拆成两个独立查询顺序执行更为快捷。
我的解决方式:临时表联表查询
查询时间降至10ms左右
参考资料:[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时
SELECT u.login_name , u.name name ,CONCAT( u.idcard,'') idcard ,u.phone phone,s.code code,c.name classroomName,d.name deptName , (SELECT d.name FROM dept d WHERE d.id = getDeptHospitalId(u.dept_id) ) hospitalName,p.name paperName,examset.name examsetName,exam.name examName ,e.mark/100 mark ,exam.start_dt examTime, (CASE e.state WHEN 'A' THEN '是' ELSE '否' END) state FROM examinee e LEFT JOIN USER u ON u.id = e.user_id LEFT JOIN dept d ON d.id = u.dept_id LEFT JOIN plan p ON p.id = e.plan_id LEFT JOIN seat s ON s.id = e.seat_id LEFT JOIN classroom c ON c.id = s.classroom_id LEFT JOIN exam on exam.id = e.exam_id LEFT JOIN examset on examset.id = exam.examset_id WHERE exam_id = '7bee06c7-8e0d-4af0-86eb-efed0edd2075'
该sql用时约10s,这还只是数据量少的时候,数据量庞大起来甚至是以分钟计时。
一开始我以为是因为索引没有添加,但是查看后发现连接字段都有索引,继续分析,我explain这句sql出来一看,终于找到问题
问题出在这里
...(SELECT d.name FROM dept d WHERE d.id = getDeptHospitalId(u.dept_id) ) hospitalName,…
这里这句相关子查询依赖于外部查询,也就是外部查询执行一行,子查询就执行一次。假如只是如此也没啥问题,添加索引仍能使它变快,但是在这里连接部分使用了自定义函数,这就导致了mysql将不会使用索引而全表查询。导致查询异常的缓慢。甚至拆成两个独立查询顺序执行更为快捷。
我的解决方式:临时表联表查询
SELECT a.*,dept.`name` hospitalName from (SELECT u.login_name , u.name name ,CONCAT( u.idcard,'') idcard ,u.phone phone,getDeptHospitalId(u.dept_id) d_id, s.code code,c.name classroomName,d.name deptName,p.name paperName,examset.name examsetName,exam.name examName ,e.mark/100 mark ,exam.start_dt examTime, (CASE e.state WHEN 'A' THEN '是' ELSE '否' END) state FROM examinee e LEFT JOIN USER u ON u.id = e.user_id LEFT JOIN dept d ON d.id = u.dept_id LEFT JOIN plan p ON p.id = e.plan_id LEFT JOIN seat s ON s.id = e.seat_id LEFT JOIN classroom c ON c.id = s.classroom_id LEFT JOIN exam on exam.id = e.exam_id LEFT JOIN examset on examset.id = exam.examset_id WHERE exam_id = '7bee06c7-8e0d-4af0-86eb-efed0edd2075' ) a LEFT JOIN dept on dept.id=a.d_id
查询时间降至10ms左右
参考资料:[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时
相关文章推荐
- 关于postgres一条sql语句中子查询的返回值不止一个,且拼接成相关规则的字符串
- mysql 查询一个表中有的记录且在另一个表中无相关的记录sql
- 关于《一个SQL语句查询问题(查询最小值)(急)》回复里面没有正确理想的答案!
- sql相关子查询,动态交叉表篇
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 一个有趣的Sql查询
- 一个SQL查询语句
- 数据统计例子,相关子查询!(SQL 中循环操作一列数据方法)
- 一个查询的SQL语句请教,希望能够用一条SQL语句得到结果
- 一个sql语句,包含有几乎所有标准查询语法
- 求助:关于一个查询的SQL语句,请高人指点如何实现,谢谢!
- [转] 一个分组查询的SQL 常用算法(附源码可直接执行) [来自--http://blog.csdn.net/rainbowsoftware/archive/2007/04/26/1585355.aspx]
- ADO带密码的数据连接、查询一个记录集、执行一SQL语句
- 第一个文章,今天比较兴奋啊! 给大家一个关于SQL复合查询的文章(动态生成多个where条件)
- 一个分组查询的SQL 常用算法(附源码可直接执行)
- 一个SQL语句查询问题(查询最小值
- 一个sql语句,包含有几乎所有标准查询语法
- 一个高效安全的SQL查询写法
- 实现了一个SQL查询整个树状结构数据的方法!找更好的!
- 一个分页查询sql