sql中使用limit來翻頁

2021-08-27 09:17:50 字數 1889 閱讀 8462

一、前言

如果你對sql的limit使用還不熟悉,請先閱讀《sql的limit

二、使用limit來翻頁

percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇」efficient pagination using mysql「的報告,有很多亮點,本文是在原文基礎上的進一步延伸。

select * from message where id > 9527 order by id asc limit 20;

select * from message where id < 9500 order by id desc limit 20;

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

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的」clue」做法,還是select * from message order by id desc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是9527,最小的是9500,比如要跳到第8頁,我看的sql語句可以這 樣寫:

select * from message where id > 9527 order by id asc limit 20,20;

跳轉到第13頁:

select * from message where id < 9500 order by id desc limit 40,20;

原理還是一樣,記錄住當前頁id的最大值和最小值,計算跳轉頁面和當前頁相對偏移,由於頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大 減少掃瞄的行數。其實傳統的limit m,n,相對的偏移一直是第一頁,這樣的話越翻到後面,效率越差,而上面給出的方法就沒有這樣的問題。

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

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

一、前言

如果你對sql的limit使用還不熟悉,請先閱讀《sql的limit

二、使用limit來翻頁

percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇」efficient pagination using mysql「的報告,有很多亮點,本文是在原文基礎上的進一步延伸。

select * from message where id > 9527 order by id asc limit 20;

select * from message where id < 9500 order by id desc limit 20;

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

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的」clue」做法,還是select * from message order by id desc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是9527,最小的是9500,比如要跳到第8頁,我看的sql語句可以這 樣寫:

select * from message where id > 9527 order by id asc limit 20,20;

跳轉到第13頁:

select * from message where id < 9500 order by id desc limit 40,20;

原理還是一樣,記錄住當前頁id的最大值和最小值,計算跳轉頁面和當前頁相對偏移,由於頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大 減少掃瞄的行數。其實傳統的limit m,n,相對的偏移一直是第一頁,這樣的話越翻到後面,效率越差,而上面給出的方法就沒有這樣的問題。

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

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

mysql 子查詢中 使用 limit

如果sql語句中的子查詢包含limit 例如 select from a where id in select id from b limit 3 會報錯 this version of mysql doesn t yet support limit in all any some subquery...

在SQL查詢中使用LIKE來代替IN

在sql查詢中根據已知id的集合來查詢結果我們通常會用到in,直接在in後面給出id的集合或是在in後面跟乙個子查詢。如下 select from orders where orderguid in bc71d821 9e25 47da bf5e 009822a3fc1d f2212304 51d4...

在SQL查詢中使用LIKE來代替IN

在sql查詢中根據已知id的集合來查詢結果我們通常會用到in,直接在in後面給出id的集合或是在in後面跟乙個子查詢。如下 select from orders where orderguid in bc71d821 9e25 47da bf5e 009822a3fc1d f2212304 51d4...