在做数据的过程中,我们会遇到很多很多写sql的情况,当数据量级很大的情况下,怎样提高sql的执行效率,怎样优化已经写好的sql。当你做的时间久了你自然会知道,但是刚开始的时候,可能了解一些技巧,更容易得心应手。这里只从sql的执行顺序来考虑,不去探讨sql的底层机制。
sql语句的优化
1.首先要知道sql语句的执行顺序(from、join、on、where、group by 、avg(sum等)、having、select、distinct、select)
2、知道了sql各子句的执行顺序,那就应该讲join放在合适的位置。
eg:order中有100w条数据,orderdetail中有500w条数据,order与orderdetail唯一的关联是ordercode。现在需要知道2019年3月15号卖得最好的50个单品,以及销量。
order的字段:(ordercode,订单号),(paytime,支付时间)
orderdetail的字段:(ordercode,订单号),(skucode,商品号),(skuname,商品名称),(quantity,数量),(amount,金额)
select b.skuname,sum(b.quanity) num
from order a
inner join orderdetail b
on a.ordercode=b.ordercode
where left(a.paytime,10)='2019-03-15'
group by b.skuname
order by num desc
limit 50
这样可以得到2019年3月15号的单品销量排名前50的产品及销量。这里join的结果是100w*500w=5亿。如果数据继续增加,可想而知,这种情况可以将限制条件放到某个表,这样sql看起来会更复杂,但是会减少join的量速度也会快。
select b.skuname,sum(b.quanity) num
from
(
select *
from order
where left(paytime,10)='2019-03-15'
) a
inner join orderdetail b
on a.ordercode=b.ordercode
group by b.skuname
order by num desc
limit 50
数据量小的时候完全没有必要这样做。只是简单两个表join的时候,要根据情况来看。但是当出现七八个表join,且数据量都不小的时候可以考虑这样的处理。
有时候可以将需要执行半个小时的sql优化为只需要几分钟就能执行完的sql。哪怕sql变长了,很多时候直接写脚本定时作为调度任务,这样sql长短不重要,效率比较重要。
在生产环境中七八张表join的情况还是会比较多的,这样可以大大提高效率。
注意:这里的两张表只是随便举的例子,不是生产环境中的表。生产环境中的表要复杂得多,考虑的因素多,所以字段也会很多。