浏览 3478 次
锁定老帖子 主题:MYSQL子查询的优化
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-09-24
或是CID 为1 2 3 4 5 这样的多个的,可以写为 select rowkey from conditionresult_tab where cid=1 and rowkey in (select rowkey from conditionresult_tab where cid=2 and rowkey in (select rowkey from conditionresult_tab where cid=3)) ,就是一个子查询,查询交集的,这样的SQL语句有什么优化方法呢? 现在这样的查询速度特别慢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-09-24
一般尽量少用子查询,子查询in的可以改成exists
|
|
返回顶楼 | |
发表时间:2012-09-24
wbsh583 写道 一般尽量少用子查询,子查询in的可以改成exists
MYSQL里面好像没有这个参数哦。 其实我也知道,这个子查询尽量不用,但是没有办法,这个需求必须用到 |
|
返回顶楼 | |
发表时间:2012-09-25
亦梦亦真 写道 找cid 为1 2 3 中相同的ROWKEY
或是CID 为1 2 3 4 5 这样的多个的,可以写为 select rowkey from conditionresult_tab where cid=1 and rowkey in (select rowkey from conditionresult_tab where cid=2 and rowkey in (select rowkey from conditionresult_tab where cid=3)) ,就是一个子查询,查询交集的,这样的SQL语句有什么优化方法呢? 现在这样的查询速度特别慢 这个问题是MySQL的查询优化的一个缺陷,改进的一个方法是把子查询的结果先查询出来,然后自己把结果拼进去,其实就是把一个带in 的子查询分解成两个查询。 步骤: 1 先执行 in 里头的语句 2 把1的执行结果拼成 逗号分隔的结果 3 执行外部的语句 楼主的案例需要做两次这样的操作。 还有一个方案是是把查询改写成外连接的方式,不过没想清楚的话容易把自己绕进去。 补充一个:可以看一下高性能MySQL的那个书,里头有章节专门介绍这个来着,说是以后MySQL会改掉这个缺陷,不知道现在的新版本改了没。 |
|
返回顶楼 | |
发表时间:2012-12-05
在rowkey和cid上做索引。
select tab1.rowkey from ctab tab1 join (select tab2.rowkey from ctab tab2 join ctab tab3 on tab2.rowkey = tab3.rowkey and tab2.cid = 2 and tab3.cid = 3) as tab4 on tab1.rowkey = tab4.rowkey and tab1.cid = 1 试着用explain分析 |
|
返回顶楼 | |