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

一次非常有趣的SQL优化经历

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

正常情况下是先join再进行where过滤,但是我们这里的情况,如果先join,将会有70w条数据发送join,因此先执行where过滤是明智方案,现在为了排除mysql的查询优化,我自己写一条优化后的sql

  1. SELECT  
  2.     s.*  
  3. FROM  
  4.     (  
  5.         SELECT  
  6.             *  
  7.         FROM  
  8.             SC sc  
  9.         WHERE  
  10.             sc.c_id = 0  
  11.         AND sc.score = 100  
  12.     ) t  
  13. INNER JOIN Student s ON t.s_id = s.s_id 

即先执行sc表的过滤,再进行表连接

执行时间为:0.054s

和之前没有建s_id索引的时间差不多

查看执行计划:

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

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

再执行查询:

  1. SELECT  
  2.     s.*  
  3. FROM  
  4.     (  
  5.         SELECT  
  6.             *  
  7.         FROM  
  8.             SC sc  
  9.         WHERE  
  10.             sc.c_id = 0  
  11.         AND sc.score = 100  
  12.     ) t  
  13. INNER JOIN Student s ON t.s_id = s.s_id 

执行时间为:0.001s

这个时间相当靠谱,快了50倍

执行计划:

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

(编辑:常州站长网)

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

热点阅读