一、原始的SQL
1、说明 csm_001.sale_bill
1)表在字段 order_state 、update_time 有联合索引
2)表不走上面的联合索引,走全表扫描
3)表的数据量约400万,数据库版本5.6
2、原始SQL如下
SELECT DATE_FORMAT(update_time, '%Y%m%d%H%i%S') AS update_time, bill_type, bill_number
FROM csm_001.sale_bill
WHERE update_time >= '2024-02-29 18:19:15'
AND order_state = 2
AND update_time <= '2024-02-29 18:59:59'
ORDER BY update_time LIMIT 0, 500;
二、优化分析
1、SQL改写
通过表的id快速取数据的特性
SELECT DATE_FORMAT(`sale_bill`.`update_time`, '%Y%m%d%H%i%S') AS `update_time`, `sale_bill`.`bill_type`, `sale_bill`.`bill_number`
FROM `csm_001`.`sale_bill`
INNER JOIN
( SELECT `id` FROM `csm_001`.`sale_bill` WHERE `update_time` >= '2024-02-29 18:19:15' AND `order_state` = 2 AND `update_time` <= '2024-02-29 18:59:59' ORDER BY `update_time` LIMIT 0, 500 )
`tmp_0` USING (`id`)