mysql分頁原理和高效率的mysql分頁查詢語句

2022-09-17 07:09:11 字數 2304 閱讀 3108

這篇文章主要介紹了mysql分頁原理和高效率的mysql分頁查詢語句,大家參考使用吧

以前我在mysql中分頁都是用的 limit 100000,20這樣的方式,我相信你也是吧,但是要提高效率,讓分頁的**效率更高一些,更快一些,那我們又該怎麼做呢?

第一部分:看一下分頁的基本原理:

mysql explain select * from message order by id desc limit 10000, 20

***************** 1. row **************

id:

1select_type: ******

table: message

type: index

possible_keys:

null

key: primary

key_len: 4

ref: null

rows: 10020

extra:

1 row in set (0.00 sec)

對上面的mysql語句說明:limit

10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit

100000,100,需要掃瞄100100行,在乙個高併發的應用裡,每次查詢需要掃瞄超過10w行,效能肯定大打折扣。文中還提到limit

n效能是沒問題的,因為只掃瞄n行。

第二部分:根據雅虎的幾位工程師帶來了一篇efficient pagination using

mysql的報告內容擴充套件:在文中提到一種clue的做法,給翻頁提供一些線索,比如還是select * from message order by id

**如下:

select * from message where id>1020

**如下:

select * from message where id<1000

不管翻多少頁,每次查詢只掃瞄20行。

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的clue做法,還是select * from message

order by id desc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是2519,最小的是2500;

當是第10頁的sql如下:

**如下:

select * from tb_goods_info where auto_id

>=2500 order by auto_id asc limit 0,20

比如要跳到第9頁,sql語句可以這樣寫:

**如下:

select * from tb_goods_info where auto_id

<2500 order by auto_id desc limit 0,20

比如要跳到第8頁,sql語句可以這樣寫:

**如下:

select * from tb_goods_info where auto_id

<2500 order by auto_id desc limit 20,20

比如要跳到第7頁,sql語句可以這樣寫:

**如下:

select * from tb_goods_info where auto_id

<2500 order by auto_id desc limit 40,20

跳轉到第11頁:

**如下:

select * from tb_goods_info where auto_id

>2519 order by auto_id asc limit 0,20

跳轉到第12頁:

**如下:

select * from tb_goods_info where auto_id

>2519 order by auto_id asc limit 20,20

跳轉到第13頁:

**如下:

select * from tb_goods_info where auto_id

>2519 order by auto_id asc limit 40,20

原理還是一樣,記錄住當前頁id的最大值和最小值,計算跳轉頁面和當前頁相對偏移,由於頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大減少掃瞄的行數。其實傳統的limit

m,n,相對的偏移一直是第一頁,這樣的話越翻到後面,效率越差,而上面給出的方法就沒有這樣的問題。

注意sql語句裡面的asc和desc,如果是asc取出來的結果,顯示的時候記得倒置一下。

已在60w資料總量的表中測試,效果非常明顯

mysql分頁原理和高效率的mysql分頁查詢語句

以前我在mysql中分頁都是用的 limit 100000,20這樣的方式,我相信你也是吧,但是要提高效率,讓分頁的 效率更高一些,更快一些,那我們又該怎麼做呢?第一部分 看一下分頁的基本原理 複製 如下 mysql explain select from message order by id d...

mysql分頁原理和高效率的mysql分頁查詢語句

以前我在mysql中分頁都是用的 limit 100000,20這樣的方式,我相信你也是吧,但是要提高效率,讓分頁的 效率更高一些,更快一些,那我們又該怎麼做呢?第一部分 看一下分頁的基本原理 如下 mysql explain select from message order by id desc...

mysql分頁原理和高效率的mysql分頁查詢語句

這篇文章主要介紹了mysql分頁原理和高效率的mysql分頁查詢語句,大家參考使用吧 以前我在mysql中分頁都是用的 limit 100000,20這樣的方式,我相信你也是吧,但是要提高效率,讓分頁的 效率更高一些,更快一些,那我們又該怎麼做呢?第一部分 看一下分頁的基本原理 複製 如下 mysq...