MySQL深度分頁
阿新 • • 發佈:2021-01-09
假設有一個千萬量級的表,取1到10條資料;
select * from table limit 0,10;
select * from table limit 1000,10;
這兩條語句查詢時間應該在毫秒級完成;
select * from table limit 3000000,10;
你可能沒想到,這條語句執行之間在5s左右;
為什麼相差這麼大?
可能mysql並沒有你想的那麼智慧,比如你要查詢 300w開始後面10條資料;mysql會讀取300w加10條這麼多的資料,只不過 過濾後返回最後10條而已!!!
那麼如果解決這個問題呢;這裡總結三種常用方法;
第一種簡單粗暴,就是不允許檢視這麼靠後的資料,比如百度就是這樣的
最多翻到76頁就不讓你翻了,這種方式就是從業務上解決;
第二種方法,在查詢下一頁時把上一頁的行id作為引數傳遞給客戶端程式,然後sql就改成了
select * from table where id>3000000 limit 10;
這條語句執行也是在毫秒級完成的,id>300w其實就是讓mysql直接跳到這裡了,不用依次在掃描全面所有的行
如果你的table的主鍵id是自增的,並且中間沒有刪除和斷點,那麼還有一種方式,比如100頁的10條資料
select * from table where id>100*10 limit 10;
最後第三種方法:延遲關聯
我們在來分析一下這條語句為什麼慢,慢在哪裡。
select * from table limit 3000000,10;
玄機就處在這個 * 裡面,這個表除了id主鍵肯定還有其他欄位 比如 name age 之類的,因為select * 所以mysql在沿著id主鍵走的時候要回行拿資料,走一下拿一下資料;
如果把語句改成
select id from table limit 3000000,10;
你會發現時間縮短了一半;然後我們在拿id分別去取10條資料就行了;
語句就改成這樣了:
select table.* from table inner join ( select id from table limit 3000000,10 ) as tmp on tmp.id=table.id;
這三種方法最先考慮第一種 其次第二種,第三種是別無選擇
轉:https://blog.csdn.net/qq_22771739/article/details/82773205