加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

一通骚操作,我把SQL执行效率提高了10000000倍!

发布时间:2019-06-21 15:53:46 所属栏目:MySql教程 来源:风过无痕
导读:副标题#e# 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: createtableCourse( c_idintPRIMARYKEY, namevarchar(10) ) 数据100条 学生表: createtableStudent( idintPRIMARYKEY, namevarchar(10) ) 数据70000条 学生成绩表SC CREATEtableSC(

时间: 1.076s,竟然时间还变长了,什么原因?查看执行计划:

一通骚操作,我把SQL执行效率提高了10000000倍!

优化后的查询语句为:

  1. SELECT `YSB`.`s`.`s_id` AS `s_id`, `YSB`.`s`.`name` AS `name`FROM `YSB`.`Student` `s`JOIN `YSB`.`SC` `sc`WHERE ( ( `YSB`.`sc`.`s_id` = `YSB`.`s`.`s_id` ) AND (`YSB`.`sc`.`score` = 100) AND (`YSB`.`sc`.`c_id` = 0) ) 

貌似是先做的连接查询,再进行的where条件过滤

回到前面的执行计划:

一通骚操作,我把SQL执行效率提高了10000000倍!

这里是先做的where条件过滤,再做连表,执行计划还不是固定的,那么我们先看下标准的sql执行顺序:

一通骚操作,我把SQL执行效率提高了10000000倍!

正常情况下是先join再进行where过滤,但是我们这里的情况,如果先join,将会有70w条数据发送join做操,因此先执行where过滤是明智方案

现在为了排除mysql的查询优化,我自己写一条优化后的sql

  1. SELECT    s.*FROM    (        SELECT            *        FROM            SC sc        WHERE            sc.c_id = 0        AND sc.score = 100    ) tINNER JOIN Student s ON t.s_id = s.s_id 

即先执行sc表的过滤,再进行表连接,执行时间为:0.054s

和之前没有建s_id索引的时间差不多,查看执行计划:

一通骚操作,我把SQL执行效率提高了10000000倍!

先提取sc再连表,这样效率就高多了,现在的问题是提取sc的时候出现了扫描表,那么现在可以明确需要建立相关索引

  1. CREATE index sc_c_id_index on SC(c_id);CREATE index sc_score_index on SC(score); 

再执行查询:

  1. SELECT    s.*FROM    (        SELECT            *        FROM            SC sc        WHERE            sc.c_id = 0        AND sc.score = 100    ) tINNER JOIN Student s ON t.s_id = s.s_id 

执行时间为:0.001s,这个时间相当靠谱,快了50倍

执行计划:

一通骚操作,我把SQL执行效率提高了10000000倍!

我们会看到,先提取sc,再连表,都用到了索引。

那么再来执行下sql

  1. SELECT s.* from 
  2. Student s 
  3. INNER JOIN SC sc 
  4. on sc.s_id = s.s_id 
  5. where sc.c_id=0 and sc.score=100 

执行时间0.001s

执行计划:

一通骚操作,我把SQL执行效率提高了10000000倍!

这里是mysql进行了查询语句优化,先执行了where过滤,再执行连接操作,且都用到了索引。

最近又重新导入一些生产数据,经测试发现,前几天优化完的sql执行效率又变低了

调整内容为SC表的数据增长到300W,学生分数更为离散。

先回顾下:

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读