mysql 经典优化案例_MySQL-SQL优化10大最经典案例详解
SQL語句
select * from _t where a = 1 and b = 2 order by c desc limit 10000, 10;
對于大分頁的場景,可以優先讓產品優化需求,如果沒有優化的,有如下兩種優化方式,
一種是把上一次的最后一條數據,也即上面的c傳過來,然后做“c < xxx”處理,但是這種一般需要改接口協議,并不一定可行。
另一種是采用延遲關聯的方式進行處理,減少SQL回表,但是要記得索引需要完全覆蓋才有效果,SQL改動如下
select t1.* from _t t1, (select id from _t where a = 1 and b = 2 order by c desc limit 10000, 10) t2 where t1.id = t2.id; 案例4、in + order by
索引
KEY `idx_shopid_status_created` (`shop_id`, `order_status`, `created_at`)
SQL語句
select * from _order where shop_id = 1 and order_status in (1, 2, 3) order by created_at desc limit 10
in查詢在MySQL底層是通過n*m的方式去搜索,類似union,但是效率比union高。
in查詢在進行cost代價計算時(代價 = 元組數 * IO平均值),是通過將in包含的數值,一條條去查詢獲取元組數的,因此這個計算過程會比較的慢,所以MySQL設置了個臨界值(eq_range_index_dive_limit),5.6之后超過這個臨界值后該列的cost就不參與計算了。因此會導致執行計劃選擇不準確。默認是200,即in條件超過了200個數據,會導致in的代價計算存在問題,可能會導致Mysql選擇的索引不準確。
處理方式,可以(order_status, created_at)互換前后順序,并且調整SQL為延遲關聯。
總結
以上是生活随笔為你收集整理的mysql 经典优化案例_MySQL-SQL优化10大最经典案例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 社区版 innodb_MyS
- 下一篇: java 精通_你真的精通Java吗?