[MySQL 5.6優化] -- limit x,x 優化
- 我們來分析下這條SQL存在的問題是什麼?
每條SQL都要進行limit 分頁 1000 ,每次SQL掃描的時候都會多掃描出來1000依次類似 每個SQL1+1000+SQl n 1000掃描的行數越來越多,SQL執行越來越慢 - 那麼我們這個時候應該如何進行優化呢?
1.查看表結構:
- 接下來看一下SQL:
- SQL2:SQL1:limit 13000,1000 SQL 2:limit 14000,1000 SQL3 15000,1000 .......
每次進行limit分頁後麵就會越來越多,我們怎麼優化呢?
可以進行使用create_time的時候來取,yinw create_time desc 每次取值小於 上次 最後一個分頁的值,程序中可以獲取到最後一個值
**改寫: **
NOTE:執行這條SQL的運行結果:與limit 14000, 1000 結果對比是否正確 注意create_time必須要唯一,要不然數據會出錯
- 改寫SQL與原始SQL結果對比:
和使用create_time方式的結果一樣正確,那麼我們可以利用這種方式進行優化此條SQL 在SQL還沒有較好的索引的時候就已經快了2ms 那麼這個SQL應該如何添加索引呢?
- 沒有添加索引之前的執行計劃:
從執行計劃中 Extra 部分有 Using filesort ,而且rows 有將近50w,說明索引選用的選擇率不理想;
- 那麼如何添加索引呢?
添加索引: alter table lp_finance add index `idx_a1` (`pay_day`,`pay_platform_type`,`create_time`)
- 執行時間:
- 執行計劃:
那麼這裏麵還存在這一個問題:就是type 為 ref
那麼我們來強製索引測試下:
這個時候需要思考一個問題,為什麼不強製的時候,走的也是 idx_a1 type 為ref 呢?強製了之後就是range 呢?
- 下節分享
- 總結:
在當優化limit x,x 。 添加索引是最好的方法,並發量大的時候還是會出現問題,我們應該從根本來解決問題。
如何解決呢?可以利用傳參的形式來優化,因為limit x,x MySQL是不知道從哪裏開始,是需要從頭開始掃描,直到符合lit的位置進行返回來。
解決方法: 1.create_tble 2.主鍵
最後更新:2017-07-07 12:02:47