閱讀923 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[MySQL 5.6優化] -- limit x,x 優化

**待優化SQL: **
1
2

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

最後更新:2017-07-07 12:02:47

  上一篇:go  [服務器] 網站服務器空間的選擇標準
  下一篇:go  創業者獨立服務器租用指南