select po.purchase_no purchaseNo, po.amount_status returnedStatus, SUM(mr.amount) price, GROUP_CONCAT(mr.approval_time SEPARATOR ',') returnedDate, mr.settle_org department, mr.settle_org_code settleOrgCode, GROUP_CONCAT(distinct (rmo.type) SEPARATOR ',') returnedType, GROUP_CONCAT(distinct (i.invoice_number) SEPARATOR ',') invoiceNumber, rmo.order_status orderStatus, rmo.pay_mode payMethod from bms_buyinvoice_center.purchase_order po left join bms_invoice_center.match_records mr on po.sell_number = mr.sap_order_no and mr.del_flag = 0 and mr.status = 3 and mr.del_flag = 0 left join bms_invoice_center.returned_money_order rmo on mr.returned_money_order_id = rmo.id and rmo.del_flag = 0 left join bms_invoice_center.invoice i on i.id = mr.invoice_id where po.purchase_no = '3101133355' GROUP BY po.purchase_no;
执行计划中可以看出,优化器选择了mr表为基表 select count(*) from bms_invoice_center.match_records mr where mr.del_flag = 0 and mr.status = 3 and mr.del_flag = 0;
mysql>select count(*) from bms_invoice_center.match_records mr where mr.del_flag = 0 and mr.status = 3 and mr.del_flag = 0; +--------------------+ | count(*) | +--------------------+ | 1308346 | +--------------------+ 返回行数: [1], 耗时: [792ms] mysql>desc select count(*) from bms_invoice_center.match_records mr where mr.del_flag = 0 and mr.status = 3; +--------------+-----------------------+-----------------+----------------------+----------------+-------------------------+---------------+-------------------+---------------+----------------+--------------------+-----------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +--------------+-----------------------+-----------------+----------------------+----------------+-------------------------+---------------+-------------------+---------------+----------------+--------------------+-----------------+ | 1 | SIMPLE | mr | | ALL | status_nk | | | | 1458744 | 1.00 | Using where | +--------------+-----------------------+-----------------+----------------------+----------------+-------------------------+---------------+-------------------+---------------+----------------+--------------------+-----------------+ 返回行数: [1], 耗时: [56ms] 3. 索引分析 该语句的问题: 1. 重复的过滤条件 del_flag=0 2. 没有走索引,而是全表扫描,行数145w,而返回的函数只有1行 alter table bms_invoice_center.match_records add index idx_del_flag_status (del_flag,status);
4. 测试验证
desc select count(*) from qixin.match_records mr where mr.del_flag = 0 and mr.status = 3; alter table qixin.match_records add index idx_del_flag_status (del_flag,status); 测试环境中,通过添加复合索引,优化SQL的执行计划,提高SQL执行效率。
优化建议
Top1-慢SQL明细
select po.purchase_no purchaseNo, po.amount_status returnedStatus, SUM(mr.amount) price, GROUP_CONCAT(mr.approval_time SEPARATOR ',') returnedDate, mr.settle_org department, mr.settle_org_code settleOrgCode, GROUP_CONCAT(distinct (rmo.type) SEPARATOR ',') returnedType, GROUP_CONCAT(distinct (i.invoice_number) SEPARATOR ',') invoiceNumber, rmo.order_status orderStatus, rmo.pay_mode payMethod from bms_buyinvoice_center.purchase_order po leftjoin bms_invoice_center.match_records mr on po.sell_number = mr.sap_order_no and mr.del_flag =0 and mr.status =3 and mr.del_flag =0 leftjoin bms_invoice_center.returned_money_order rmo on mr.returned_money_order_id = rmo.id and rmo.del_flag =0 leftjoin bms_invoice_center.invoice i on i.id = mr.invoice_id where po.purchase_no ='3101133355' GROUPBY po.purchase_no;