记MySQL5.6.22一SQL在order by后增加limit执行效率下降问题

问题背景:

MySQL版本:5.6.22

服务器:

操作系统:CentOS release 6.6 (Final)

内存:7.6G    CPU:4核

base_charge表数据量: 5036032行记录
merchant表数据量: 1600行记录
store表数据量: 3083行记录

完整的SQL:

SELECT bc.id, bc.state, bc.audit_state AS 'auditState', 
       bc.ref_id, bc.spdb_trade_no, m.code AS 'merchantCode', 
       m.full_name AS 'merchantName', bc.product_code AS 'institutionCode',
       bc.create_time, bc.amount AS 'amount', s.code storeCode,s.id AS 'storeId', 
       s.full_name AS 'storeName', bc.method, bc.checking_state, bc.`out_trade_no`,
       bc.`remark`, bc.longitude,bc.latitude,bc.client_ip 
FROM base_charge bc LEFT JOIN merchant m ON bc.merchant_code=m.code 
                    LEFT JOIN store s ON bc.store_id = s.id 
WHERE bc.method='xft.trade.refund' AND bc.audit_state = '0' 
ORDER BY bc.create_time DESC LIMIT 0,10

执行时间:2分钟+,没查到结果

不加LIMIT 0,10执行时间:0.575秒。

 

查到原因:

order by  limit 一起时 执行顺序不是按照:where -----> order by ------> limit

                    而是:order by------->where -----> limit 的顺序去执行的。

这样排序的时间会大大的增加,所以执行时间会很久。

可修改成如下写法:

SELECT *
FROM (
SELECT bc.id, bc.state, bc.audit_state AS 'auditState', 
       bc.ref_id, bc.spdb_trade_no, m.code AS 'merchantCode', 
       m.full_name AS 'merchantName', bc.product_code AS 'institutionCode',
       bc.create_time, bc.amount AS 'amount', s.code storeCode,s.id AS 'storeId', 
       s.full_name AS 'storeName', bc.method, bc.checking_state, bc.`out_trade_no`,
       bc.`remark`, bc.longitude,bc.latitude,bc.client_ip 
FROM base_charge bc LEFT JOIN merchant m ON bc.merchant_code=m.code 
                    LEFT JOIN store s ON bc.store_id = s.id 
WHERE bc.method='xft.trade.refund' AND bc.audit_state = '0' 
ORDER BY bc.create_time DESC 
) tmp
LIMIT 0,10

执行时间:0.588秒

你可能感兴趣的:(数据库初级)