专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
数据中心运维管理  ·  突发!又一储能电站发生火灾 ·  3 天前  
数据中心运维管理  ·  别错过!配电间、配电室等防火措施,一篇全搞定 ·  2 天前  
数据中心运维管理  ·  如何为布线环境选择合适的网络电缆标签 ·  昨天  
AustinDatabases  ·  MongoDB ... ·  昨天  
51好读  ›  专栏  ›  数据分析与开发

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

数据分析与开发  · 公众号  · 数据库  · 2016-11-10 23:49

正文

请到「今天看啥」查看全文


index sc_score_index on SC(score);


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


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


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


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



查看优化后的sql:


SELECT

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

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

FROM

`YSB`.`Student` `s`

WHERE

in_optimizer > (

`YSB`.`s`.`s_id` , EXISTS > (

SELECT

1

FROM

`YSB`.`SC` `sc`

WHERE

(

(`YSB`.`sc`.`c_id` = 0)

AND (`YSB`.`sc`.`score` = 100)

AND (

CACHE > (`YSB`.`s`.`s_id`) = `YSB`.`sc`.`s_id`

)

)

)

)


补充:这里有网友问怎么查看优化后的语句


方法如下:


在命令窗口执行



有type=all


按照我之前的想法,该sql的执行的顺序应该是先执行子查询


select s_id from SC sc where sc.c_id = 0 and sc.score = 100


耗时:0.001s


得到如下结果:



然后再执行


select s.* from Student s where s.s_id in(7,29,5000)


耗时:0.001s


这样就是相当快了啊,Mysql竟然不是先执行里层的查询,而是将sql优化成了exists子句,并出现了EPENDENT SUBQUERY,mysql是先执行外层查询,再执行里层的查询,这样就要循环70007*11=770077次。


那么改用连接查询呢?


SELECT s.* from

Student s

INNER JOIN SC sc

on sc.s_id = s.s_id

where sc.c_id =







请到「今天看啥」查看全文