Update关联查询不走索引,效率低下
2016-03-08 16:15
471 查看
优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段。形如
Sql代码
update A set A.a=(select B.b from B where A.id=B.id);
原SQL
updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(select distinctb.scrm_rptpnt_processed frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id);
b表中只有1条数据,a表中有37万条数据,应用逻辑为更新a表中id和b表相同的
这一条SQL执行了6小时未执行完,执行计划显示为全表扫描,也就是说,虽然执行1条SQl,但执行update个过程中将37万条数据进行扫描,直到倒找相同的id进行更新
尝试过hit强制走索引,也不理想,where条件中id列类型是相同的均为INT,不存在字段类型不同导致不走索引的情况。
采取的方式:
优化后的SQL
updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(select distinctb.scrm_rptpnt_processed frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id) wherea.pntmall_rptpnt_id in (select b.pntmall_rptpnt_id frompntmall_rptpoint_detail_tmp b)
优化后的SQL达到秒级,满足客户需求。
总结一下不走索引的情况:
1、条件字段选择性弱,查出的结果集较大,不走索引;2、where条件等号两边字段类型不同,不走索引;3、优化器分析的统计信息陈旧也可能导致不走索引;4、索引字段 is null 不走索引;5、对于count(*)当索引字段有not
null约束时走索引,否则不走索引;6、like
后面的字符当首位为通配符时不走索引;7、使用不等于操作符如:<>、!=
等不走索引;8、索引字段前加了函数或参加了运算不走索引;
Sql代码
update A set A.a=(select B.b from B where A.id=B.id);
原SQL
updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(select distinctb.scrm_rptpnt_processed frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id);
b表中只有1条数据,a表中有37万条数据,应用逻辑为更新a表中id和b表相同的
这一条SQL执行了6小时未执行完,执行计划显示为全表扫描,也就是说,虽然执行1条SQl,但执行update个过程中将37万条数据进行扫描,直到倒找相同的id进行更新
尝试过hit强制走索引,也不理想,where条件中id列类型是相同的均为INT,不存在字段类型不同导致不走索引的情况。
采取的方式:
优化后的SQL
updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(select distinctb.scrm_rptpnt_processed frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id) wherea.pntmall_rptpnt_id in (select b.pntmall_rptpnt_id frompntmall_rptpoint_detail_tmp b)
优化后的SQL达到秒级,满足客户需求。
总结一下不走索引的情况:
1、条件字段选择性弱,查出的结果集较大,不走索引;2、where条件等号两边字段类型不同,不走索引;3、优化器分析的统计信息陈旧也可能导致不走索引;4、索引字段 is null 不走索引;5、对于count(*)当索引字段有not
null约束时走索引,否则不走索引;6、like
后面的字符当首位为通配符时不走索引;7、使用不等于操作符如:<>、!=
等不走索引;8、索引字段前加了函数或参加了运算不走索引;
相关文章推荐
- Update关联查询不走索引,效率低下
- Update关联查询不走索引,效率低下
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。(转载)
- 使用mysql update join优化update in的查询效率
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
- update关联更新,主查询切记写上条件!!!!!!!!!!!
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
- 提高多表关联数据查询效率
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。
- mysql做update时有in关联子查询条件时效率奇慢分析
- PHP TP5 省市区表多级关联模型查询,和db方式查询封装效率
- 使用INTERSECT来提高关联查询的效率
- ORACLE数据库多表关联查询效率问题解决方案
- 如何提高SQL语言的查询效率?
- SQL 查询效率
- sql多表查询效率提升实战
- hibernate一对多关联查询去重 criteria设置 解决分页条数不正确的问题
- oracle解决多表关联分组查询问题
- yii2.0查询关联数据以及widgets小部件