mysql 分頁offset過大性能問題解決思路


在公司干活一般使用sqlserver數據庫。rownumber分頁賊好用。

但是晚上下班搞自己的事情就不用sqlserver了。原因就是自己的渣渣1核2g的小服務器完全扛不住sqlserver那么大的大塊頭,於是就使用Mysql數據庫。

一般使用MySQL分頁都是使用limit,我也這么使用的。

今天晚上打開一個服務器上的小網站,順便點幾下看看有沒有問題,不小心點到了最后一頁,卡了我近10秒才反應過來。我數據庫就7w多條數據。雖說服務器垃圾也不至於卡這么久吧。。

然后把分頁的sql找出來,去數據庫手動執行。發現確實越往后翻頁越慢,翻到四萬多條的時候,都好幾秒才響應了。這完全無法接受啊。難怪最近網站的搜索引擎權重又降低了。。5555

分頁sql如下

select id ,title,time from table where type = ‘xxx’ ORDER BY createtime limit 10 offset 45000

因為Id是主鍵,我嘗試去掉了title和time字段,馬上就秒開了。

查看數據庫執行計划,索引是已經命中了。但是為什么還是很卡呢?

查閱了不少資料,得出兩個結論

1.服務器實在是太垃圾了。

2.limit x offset x 分頁確實有性能問題,據說阿里的dba都不太建議offset太多。。。

解決方案:

既然都無法使用offset,那就曲線救國。

既然Id很快,那就先按照Id排序做分頁,查詢出一頁的Id,然后join當前表 id和Id關聯。

SELECT q.id, p.title, p.createtime from(
SELECT id from tablewhere type = @type ORDER BY createtime limit @size OFFSET @offset ) q JOIN tablep on q.id = p.id

 

然后使用新的這條sql,去數據庫查詢,直接就從10秒+降到了0.02秒的樣子。

並且繼續往后翻頁也不會有什么太大的性能問題。就先湊合到這里了。

好懷念工地的服務器。上百G的內存隨便揮霍。幾百萬上千萬的量都不咋優化,都跑的飛快。sqlserver收費也不是沒有道理的。不用做太多的配置。

自己干活就只能用小水管服務器。死扣細節做優化。


免責聲明!

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



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