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优化呢?茶已泡好,欢迎就座评论区分享!!!