问题现象
在客户的运营系统中,当客户执行某个条件的订单查询时,接口响应超时,同时服务器的cpu利用率高达100%
问题排查
问题sql
SELECT
count( 0 )
FROM
orders
WHERE
1 = 1
AND IS_PAYED = 2
AND ORDER_TYPE != 3
AND `ORDER_TYPE` = 1
AND `ORDER_NUM` IN ( SELECT ORDER_NUM FROM orders_bill WHERE OPERATION_ID = 37 );
备注
上述俩种表中的数据量分别是:4万 和七万
执行explain
关于Block Nested-Loop
问题修复
修复方案一
对order_bill表建立索引,避免全表扫描
处理后的执行计划
可以看到此时,已经使用了索引,同时mysql也不再使用Block Nested Loop
进一步优化
对order表也建立索引
执行计划
可以看到,此时对order表的查询也不再走全面扫描,而是使用了索引
最终优化
sql如下
EXPLAIN SELECT
count( 0 )
FROM
orders o
INNER JOIN ( SELECT DISTINCT ORDER_NUM FROM orders_bill WHERE OPERATION_ID = 37 ) ob ON o.ORDER_NUM = ob.ORDER_NUM
WHERE
1 = 1
AND o.IS_PAYED = 2
AND o.ORDER_TYPE != 3
AND o.`ORDER_TYPE` = 1