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

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

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

先提取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,学生分数更为离散。

先回顾下:

show index from SC

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

执行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=81 and sc.score=84 

SELECT s.* from Student sINNER JOIN SC scon sc.s_id = s.s_idwhere sc.c_id=81 and sc.score=84

执行时间:0.061s,这个时间稍微慢了点

执行计划:

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

这里用到了intersect并集操作,即两个索引同时检索的结果再求并集,再看字段score和c_id的区分度,

单从一个字段看,区分度都不是很大,从SC表检索,c_id=81检索的结果是70001,score=84的结果是39425。

而c_id=81 and score=84 的结果是897,即这两个字段联合起来的区分度是比较高的,因此建立联合索引查询效率将会更高。

从另外一个角度看,该表的数据是300w,以后会更多,就索引存储而言,都是不小的数目,随着数据量的增加,索引就不能全部加载到内存,而是要从磁盘去读取,这样索引的个数越多,读磁盘的开销就越大。

(编辑:西安站长网)

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

热点阅读