MySQL中怎么將LIMIT分頁優化?


 1.語法:
      *** limit [offset,] rows
      一般是用於select語句中用以從結果集中拿出特定的一部分數據。
      offset是偏移量,表示我們現在需要的數據是跳過多少行數據之后的,可以忽略;rows表示我們現在要拿多少行數據。
      2.栗子:
      ①select * from mytbl limit 10000,100
      上邊SQL語句表示從表mytbl中拿數據,跳過10000行之后,拿100行
      ②select * from mytbl limit 0,100
      表示從表mytbl拿數據,跳過0行之后,拿取100行
      ③select * from mytbl limit 100
      這條SQL跟②的效果是完全一樣的,表示拿前100條數據
      3.用處:
      我目前用到的地方是數據庫查詢分頁,比如前台要展示數據庫中數據,需要后台實現分頁,傳入數據要有“頁碼page”跟“每頁數據條數nums”。
      對應SQL大概是這樣子:select * from mytbl order by id limit (page-1)*nums,nums
      4.問題發現:
      在數據量不大或者是大數據量的前幾頁的時候,性能還算不壞,但是大數據量頁碼稍微大一點性能便下降比較嚴重。
      5.問題分析:
      原因出在Limit的偏移量offset上,比如limit 100000,10雖然最后只返回10條數據,但是偏移量卻高達100000,數據庫的操作其實是拿到100010數據,然后返回最后10條。
      那么解決思路就是,我能不能跳過100000條數據然后讀取10條,而不是讀取100010條數據然后返回10條數據。
      6.問題解決實現:
      原SQL語句如下:
select * from mytbl order by id limit 100000,10  改進后的SQL語句如下:
      select * from mytbl where id >= ( select id from mytbl order by id limit 100000,1 ) limit 10  注:假設id是主鍵索引,那么里層走的是索引,外層也是走的索引,所以性能大大提高
---------------------
作者:Dream-seekerBoy 
原文:https://blog.csdn.net/zhao15127334470/article/details/81279802


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM