sql优化不要太简单

1.今天生产环境上一个页面卡死,跟踪代码发现凶手

SELECT
        h1.taskId         ,
        h1.taskId_Sequence,
        h1.organizationId ,
        h1.warehouseId    ,
        h1.fmLocation     ,
        h1.fmId           ,
        h1.sku            ,
        h1.fmlotNum       ,
        h1.taskProcess    ,
        das.serialNo      ,
        das.qty
from
        TSK_TASKLISTS h1
left join
        DOC_ASN_SERIALNO das
on
        (
                h1.organizationId = das.organizationId
        and h1.warehouseId        = das.warehouseId
        and h1.fmLotNum           = das.lotNum
        and h1.fmLocation         = das.locationId
        and h1.fmId               = das.traceId
        and h1.sku                = das.sku
        and h1.customerid         = das.customerId
        and das.stockFlag         = 'Y')
WHERE
        1       = 1
and     das.qty > 0
and     h1.organizationId                  = 'FERROTEC'
and     h1.warehouseId                     = '115'
and     h1.docNo                           = 'C11524070002'
and     h1.taskType                        = 'CC'
and     h1.taskProcess                     = '00'
and     not exists
        (
                select
                        1
                from
                        les_cou_serialno lcs
                where
                        lcs.activeflag     = 'Y'
                and     lcs.organizationid = das.organizationid
                and     lcs.warehouseid    = das.warehouseid
                and     lcs.serialno       = das.serialno
                and     lcs.cyclecountno   = h1.docno)

就是这段sql,执行了60多秒,查询超时,报504

2.排查问题思路:逐步去掉关联的sql,找到查询慢的sql

最终发现关联这个DOC_ASN_SERIALNO就很慢,去掉就很快,用explain查看执行计划,发现key列只走了tracid索引,而实际关联这么多条件,关联表的时候确保每一个字段都有索引,最后在DOC_ASN_SERIALNO加上索引,查询时间仅用了一秒,效率提高60-70倍!

3.注意事项

加索引的时候一定要确保这张表没有被使用(查询,或者其它操作),否则会造成死锁!生产环境一定要注意,那如何避免?

加索引前查询以下语句:

select * from information_schema.processlist where command !='Sleep' and info like '%A%';

如果info列展示的为以上语句,代表没有被使用,再迅速加上索引

以上就是我的分享,一个工作一年的Java程序员,大家平时有遇到什么复杂的sql优化呢?茶已泡好,欢迎就座评论区分享!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值