mysql 行號查詢及分頁

在開發過程中,需要對mysql數據庫進行多表級聯查詢,其中爲了提高分頁查詢性能,用到了mysql中查詢行號。


1.mysql分頁查詢


常規的mysql分頁查詢,我們可以使用limit關鍵字:

SELECT * FROM table ORDER BY id LIMIT 1000, 10;

對於使用limit關鍵字實現mysql的分頁查詢十分方便,但當數據量增大時,使用limit關鍵字進行分頁的效率就很不理想了(limit的分頁效率與第一個參數有關,當數據量增大時,limit的第一個參數增大,分頁效率不斷降低)。

爲了提高mysql分頁查詢效率,我們可以採用如下方式:

SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

SELECT * FROM table WHERE id IN(10000, 100300, 1000020...); 

前一種是對於連續數據的分頁處理,後者是對非連續數據的分頁處理(先找出需要分頁的id號)。


2.實際問題


在實際開發時,由於之前 的分頁是通過連續的方式進行分頁,而在修改sql級聯查詢之後分頁的數據不再連續,爲了不想去修改原來的分頁方式,希望能實現對不連續數據也能通過BETWEEN、AND關鍵字實現分頁邏輯。

爲了實現這個效果,我想到了行號是連續的,我們可以通過對行號分頁從而實現目的。


3.mysql的行號


在mysql中,獲取rowno只能通過變量的方式獲取。一般形式如下:

SELECT @rowno:=@rowno+1 as rowno,r.* from t_article r,(select @rowno:=0) t

如果要對現有的sql增加行號的獲取可以這樣做:

SELECT @rowno:=@rowno+1 as rowno, O.* from (old_sql) O,(select @rowno:=0) t

old_sql是之前已有的sql,在上方sql中吧原有的sql看成了一張新的表

4.利用mysql的行號進行分頁


要實現這個效果其實很簡單,只要在之前的根據行號分頁的sql上增加分頁條件即可:

select P.* from (SELECT @rowno:=@rowno+1 as rowno, O.* from (old_sql) O,(select @rowno:=0) t) P where rowno between ? and ?

需要注意的是,order by 等條件應該包含在old_sql中
發佈了33 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章