今天遇到個奇葩的問題,
sql 數據量很大 有where 和order by,不加order by 速度很快,加了就很慢
一、首先我們對這條sql執行查詢計划:
explain select t.order_id from book_order t ORDER BY t.order_id desc
explain select t.order_id from book_order t
這條語句應用的索引是idx_bo_order_book_local
進一步確定,再對使用where條件后,索引變成了主鍵。
explain select t.order_id from book_order t where t.order_id = 1593539
通過以上的情況可以看出:
MySQL默認的查詢(沒有where條件),不一定使用主鍵,由於MySQL的每一條簡單查詢只應用一個索引,所以,這個時候使用order by 主鍵,主鍵的索引功能失效。
二:解決辦法
1、order by 索引(where條件中引用的索引)。
2、強制使用主鍵:FORCE INDEX(PRI),如果想強制使用索引,則用FORCE INDEX(索引名)。
explain select t.order_id from book_order t FORCE INDEX(idx_bo_order_book_local) ORDER BY t.order_id desc;
三、其他order by 索引失效的原因分析
1、MySQL每天一條簡單語句只應用一個索引,所以order by的字段要在索引之中,並且和where條件可以合並成組合索引。
2、select的字段,必須是索引字段。(主鍵查詢除外)
3、如果sql語句為復合語句,包含子查詢等,可以把語句分解成簡單查詢來分析。