MYSQL的优化

更新时间:2020-08-17 11:05:12点击次数:548次


一、大小表优化

left join : 小表 left join 大表
right join : 大表 right join 小表



二、子QUERY 代替join

如下所示:

select o.no,s_order.no,sum(s_item.count),sum(after_sale_item.count) from buyer_order o left join seller_order s_order on o.id = s_order.buyer_order_id left join seller_order_item s_item on s_order.id = s_item.seller_order_id left join seller_order_after_sale after_sale on s_order.id = after_sale.seller_order_id left join seller_order_after_sale_item after_sale_item on after_sale.id = after_sale_item.after_sale_id where o.add_time >='2019-05-01' group by o.id,s_order.id order by o.id limit 0,10;

优化后:

select o.id,o.no,s_order.no, (select sum(sot.count) from seller_order so left join seller_order_item sot on so.id = sot.seller_order_id where so.id =s_order.id ), (select sum(osat.count) from seller_order_after_sale osa left join seller_order_after_sale_item osat on osa.id = osat.after_sale_id where osa.seller_order_id = s_order.id ) from buyer_order o left join seller_order s_order on o.id = s_order.buyer_order_id where o.addTime >='2019-05-01' order by o.id limit 0,10;

三、优化点分析

用子query代替left join,依据join的原理,减少了驱动表的数据量,从而减少访问匹配表的次数。

不使用group by减少了cpu对分组数据的处理,分组的操作可以理解为数据库引擎查询数据出来再处理的过程,当然是越少越好。

因为group by的优先级是在limit之前的,所以之前是对查询的所有数据先进行分组,然后取10条。优化后,先取10条,然后再进行上面的sum()操作。优化力度还是挺大的。





  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息