1. 程式人生 > 資料庫 >MySQL深度分頁

MySQL深度分頁

假設有一個千萬量級的表,取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