序
该文章记录个人工作或者学习中经历的MySQL优化,该文章不做定时更新
1.子查询
1.1背景
用mysql保存了一些不太更新的数据,且数据量不大,所以用到了一些join及子查询
但是在开发阶段也发现慢sql,但表数据量不足5k。
in 接子查询是非常容易引发慢sql的,调优也比较难定位,一般这种推荐写成两个sql,将子查询的结果直接放在第二个sql的in里面。
select name
from t
where id in
(
select t.id
from a
where age>10
)
sql的结构跟上类似,外层查询id用了in,子查询出来的数据都是可控的,不超过50条
使用EXPLAIN进行分析
发现了DEPENDENT SUBQUERY这个关键字,及外层查询id in操作怎么检索了这么多条数据(这是主键)!
1.2原因
http://itindex.net/detail/46772-优化-mysql-dependent
网上一搜DEPENDENT SUBQUERY就很容易找到关于子查询优化的文章,上面一篇挺好的!
原因是你以为sql会先 进行子查询,然后将子查询的接口 in一下就出来。但并不是
文中链接提到的《高性能mysql》的观点,总之用子查询(一般使用子查询外层条件是 in),会造成外层查询的全量检索,导致查询速度变慢。
1.3如何优化
可以使用临时表进行join
select name
from t t1,(
select t.id
from a
where age>10
) t2
where t1.id=t2.id
这样检索的数据量就比较正常了