注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

删除IDX$$_xxxx索引,从而优化sq  

2016-08-16 17:19:39|  分类: 优化 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原sql:
select *
  from COUPONCODE.COUPONCODEINFO couponcode0_
 where 1 = 1
   and couponcode0_.INSTOCKSTATE = '2'
   and (couponcode0_.COUPONCODEMAINID is not null)
   and couponcode0_.STATE = '0'
   and ((couponcode0_.BINDSTATUS = '1' or couponcode0_.BINDSTATUS = '3') and couponcode0_.BINDPHONE = '13807200780' or
        (couponcode0_.BINDSTATUS = '2' or couponcode0_.BINDSTATUS = '3') and couponcode0_.BINDMENBER = '106057699')   
 order by couponcode0_.ENDTIME
原来执行成本为2万多,每次执行时间为2秒左右,但该sql一般返回1行或0行,所以应该有优化的余地。
从sql中可以分析出BINDPHONE和BINDMENBER(会员号),这两个强过滤性限制条件保证了每次返回行数应该很少,这个sql只需走BINDPHONE和BINDMENBER的索引,回表后的数据就很少,然后用其他where条件做下过滤,就能很快返回sql结果
但该sql的执行计划如下:
删除IDX_xxxx索引,从而优化sq - 熊猫兔 - Oracle、MySQL资料及经验
 

用到了BINDSTATUS 列的索引IDX$$_07D90003,该列只有三个值,做bitmap操作从索引名看这是个自动优化出来的索引名,所以未必靠谱,还是考虑上面自己分析的结果,删掉这个这个索引就可能提高sql执行速度。删掉索引IDX$$_07D90003后,果然执行计划变好了,代价降了近10倍,速度也在1秒以内了,如下图:
删除IDX_xxxx索引,从而优化sq - 熊猫兔 - Oracle、MySQL资料及经验
 
但发现还是用到了IDX$$_07D90001,如下图所示,这两列也是自动建立的索引,还是考虑之前的分析,走BINDPHONE和BINDMENBER列上的索引就能很快得到sql结果,于是把这个索引也删掉试试。
 删除IDX_xxxx索引,从而优化sq - 熊猫兔 - Oracle、MySQL资料及经验
 索引删除之前该表的所有索引

最新的执行计划变成了如下:
删除IDX_xxxx索引,从而优化sq - 熊猫兔 - Oracle、MySQL资料及经验
 
sql执行速度变成了0.016秒,该sql优化效果很满意了。
至于为何出现IDX$$_07D90003这种索引,应该是之前有开发或DBA使用了自动sql优化,并接受了优化建议,而目前来看自动sql优化还不太靠谱,仅供参考,合不合理要根据实际情况来分析


  评论这张
 
阅读(39)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017