今天從慢查詢發現一條語句查詢時間達6秒。結果只查出一條記錄。
原語句如下
SELECT
biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC
LIMIT 0,100;
執行計划
shop_id都有索引可卻走了時間gmt_create的索引,rows=861665
優化方法3種:
1:強制走shop_id索引
SELECT
biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order force index(idx_shop_id)
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC
LIMIT 0,100;
2:用子查詢:
select * from ( SELECT biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id
FROM trade.biz_order
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC) t
LIMIT 0,100;執行計划如上一樣
FROM trade.biz_order
WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6
ORDER BY gmt_create DESC, biz_order_id DESC) t
LIMIT 0,100;執行計划如上一樣
3:調換order by中的兩個條件順序
ORDER BY biz_order_id DESC ,gmt_create DESC limit 0,100;換成這樣。我發現這樣執行計划的rows=1.9萬效果更好。
4:還有一種方法刪除
gmt_create列的索引,原理和方法3差不多。
總結:mysql中的order ,limit一起使用時的順序是這樣的和oracle不一樣
order -->limit-->where條件
而常規一般是where-->order-->limit。
