一、前言
如果你對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...