mysql in()后子查询优化

线上数据发现一条数据大量等待的现象,经过explain发现这个sql写法存在问题,这里简单记录一下.sql

业务场景是这样:测试

存在购物车和费用两张表,购物车数据是购买商品时生成,用于记录购买商品数据,同时购买的商品也会生成费用表,用于统计商品总的支出状况(至关于订单),购物车和费用的关系是多对一,经过gg_gwc.fyxh=gg_fei.id关联.这里须要更新知足条件的购物车关联的fei的数据.优化

  • 原始查询方式:

由于是测试环境,实际的执行时间并不长,可是gg_fei表发现虽然使用了id索引,可是查询条件倒是全表查询,由于in条件中使用子查询会形成索引失效;blog

  • 优化尝试方式
  • 方式1:

这种方式实际的结果显示是失败的,由于它没有从根本上改变in(子查询)这种方式,它的想法是减小子查询的数据,来加速sql访问,单纯从这条sql来看,实际确实也有点做用,他将子查询8条限制为2条;可是第一条sql由于条件已经很精确,它实际的查询只有一条;索引

  • 方式2:

这种方式是经过内链接查询实现,实际查询结果显示有效,它将gg_fei表查询数量降到了1条,gg_gwc也使用了索引,可是由于关联查询是一个子查询他会生成一个派生表(简化的临时表),这个派生表也会增长一次查询,虽然有效可是从表面上不是最优解.im

  • 方式3:

查资料有人说:from a,b where a.id=b.id 是内链接的简化方式,这种方式它成功的去除了子查询,inner join也能够写成这种方式,目前来看是这个几个方式里的最优解统计

相关文章
相关标签/搜索