Mysql 分頁實現與效能優化

2021-10-19 18:25:56 字數 1392 閱讀 4952

分頁在前後端配合開發中,是常用的列表內容展示方式,這裡就介紹下常規分頁的用法以及效率優化的方法。

我們常用的分頁方式是利用 page、limit 進行查詢,如下

select * from `表名` order by id desc limit 0,20;

select * from `表名` order by id desc limit 60,20;

...

這種常規用法在大多數情況下,都可以勝任業務需要,但是在列表資料更新頻繁或者頁數較大的情況會有各種問題:

1.1 資料更新頻繁

如新聞資料,每秒有數百、數十條新聞新增進庫,那麼使用者查詢完 第一頁20條資料,再查詢第二頁資料的時候,就會出現第一頁的部分資料,這就造成了重複問題。這種情況很好理解,不做過多描述

1.2 頁數較大問題

當使用者瀏覽資料,瀏覽至500頁,甚至5000頁時,mysql的查詢效率將極低,如下:

查詢第一頁時

查詢第500頁時

通過expain 可以觀察到,rows 值水漲船高,這就意味著,雖然查詢的最終結果是20條資料,但是查詢第500頁的時候,其實mysql是查詢出了10020條資料,然後再擷取20條資料,這樣效率將會大大降低。實際查詢表明:第一頁查詢用時0.025s,而第500頁用時2.070s,這不能忍...

解決方法也比較簡單,就是增加乙個last_id查詢。

select id, add_time, ... from `表明` where id > 200 order by id asc limit 0,20;

select id, add_time, ... from `表明` where id > 1000 order by id asc limit 0,20;

select id, add_time, ... from `表明` where id > 3000 order by id asc limit 0,20;

select id, add_time, ... from `表明` where id > 10000 order by id asc limit 0,20;

...

這樣做的另外乙個好處就是,不會出現重複資料的查詢問題,一舉兩得...

注意:last_id 肯定要是主鍵(pk)或者索引字段。

MySQL分頁效能優化

在對大表進行分頁時,如果在服務端實現分頁,大多數情況採用sql的limit語法來實現。但是當頁數越來越大時,效能很可能成為問題,尤其是需要查詢表的所有字段。1.索引與非索引字段 在查詢的結果集中,如果只包含索引字段,效能相比於包含非索引字段,差別很大。下面是乙個簡單的例子,在大約50w行的表上操作 ...

mysql 分頁效能優化

最簡單的分頁方法是這樣的 select from exarticletemp order by createdate desc limit 10000,10 該表中存在5w左右資料 執行時間平均在10s左右,因此該種方式在資料量大的情況下查詢效率極低。優化方式有以下幾種 1.此種方式平均在7 8s之...

MySQL分頁效能優化指南

一道面試的問題,當mysql表中有資料量很大的時候如何做分頁。當時只知道在資料量很大的時候可以分表,但不知道不分表時可以怎麼做。唉,誰讓 商就那麼幾條資料,乙個簡單的limit,offset就完全hold住了 捂臉 很多應用往往只展示最新或最熱門的幾條記錄,但為了舊記錄仍然可訪問,所以就需要個分頁的...