首页 存档 技术 查看内容

一次非常有意思的 SQL 优化经历

2018-3-30 13:00 |来自: 互联网 300 0

摘要: 全世界只有3.14 %的人关注了 数据与算法之美 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 createtableCourse( c_idintPRIMARY KEY, namevarchar(10) ) 数据100条 学生表: createtableStudent( id ...


全世界只有3.14 %的人关注了

数据与算法之美


我用的数据库是mysql5.6,下面简单的介绍下场景


课程表


createtableCourse(

c_idintPRIMARY KEY,

namevarchar(10)

)


数据100条


学生表:


createtableStudent(

idintPRIMARY KEY,

namevarchar(10)

)


数据70000条


学生成绩表SC


CREATEtableSC(

sc_idintPRIMARY KEY,

s_idint,

c_idint,

scoreint

)


数据70w条


查询目的:


查找语文考100分的考生


查询语句:


select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )


执行时间:30248.271s


晕,为什么这么慢,先来查看下查询计划:


EXPLAIN

selects.*fromStudentswheres.s_idin(selects_idfromSCscwheresc.c_id=0andsc.score=100)



发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。


先给sc表的c_id和score建个索引


CREATEindexsc_c_id_indexonSC(c_id);

CREATEindexsc_score_indexonSC(score);


再次执行上述查询语句,时间为: 1.054s


快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,建索引很有必要,很多时候都忘记建


索引了,数据量小的的时候压根没感觉,这优化的感觉挺爽。


但是1s的时间还是太长了,还能进行优化吗,仔细看执行计划:



查看优化后的sql:


SELECT

`YSB`.`s`.`s_id`AS`s_id`,

`YSB`.`s`.`name`AS`name`

FROM

`YSB`.`Student``s`

WHERE

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部