sql语句的优化(mysql)

在做数据的过程中,我们会遇到很多很多写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的情况还是会比较多的,这样可以大大提高效率。

注意:这里的两张表只是随便举的例子,不是生产环境中的表。生产环境中的表要复杂得多,考虑的因素多,所以字段也会很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值