论坛首页 综合技术论坛

MYSQL子查询的优化

浏览 3478 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-09-24  
找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语句有什么优化方法呢?
现在这样的查询速度特别慢
   发表时间:2012-09-24  
一般尽量少用子查询,子查询in的可以改成exists
0 请登录后投票
   发表时间:2012-09-24  
wbsh583 写道
一般尽量少用子查询,子查询in的可以改成exists

MYSQL里面好像没有这个参数哦。
其实我也知道,这个子查询尽量不用,但是没有办法,这个需求必须用到
0 请登录后投票
   发表时间: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会改掉这个缺陷,不知道现在的新版本改了没。
0 请登录后投票
   发表时间: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分析
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics