在開發過程中,需要對mysql資料庫進行多表級聯查詢,其中為了提高分頁查詢效能,用到了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號)。
在實際開發時,由於之前 的分頁是通過連續的方式進行分頁,而在修改sql級聯查詢之後分頁的資料不再連續,為了不想去修改原來的分頁方式,希望能實現對不連續資料也能通過between、and關鍵字實現分頁邏輯。
為了實現這個效果,我想到了行號是連續的,我們可以通過對行號分頁從而實現目的。
在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看成了一張新的表
要實現這個效果其實很簡單,只要在之前的根據行號分頁的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中
mysql查詢行號
mysql查詢結果集中顯示行號的方法。建立user表 create table user name varchar 12 default null engine innodb default charset utf8 插入若干條資料 insert into test user name values...
MySQL查詢顯示行號
oracle中有專門的rownum 顯示行號的函式,而mysql沒有專門的顯示行號函式,但可以通過用 rownum自定義變數顯示行號。主要 rownum rownum 1 rownum select rownum 0 as rn例 如果按照某個字段排序,行號會不規則排列,換成先排序,外層加上行號 s...
Mysql 分頁查詢 快照 Mysql分頁查詢優化
select from orders history where type 8 limit 1000,10 該條語句將會從表 orders history 中查詢offset 1000開始之後的10條資料,也就是第1001條到第1010條資料 1001 id 1010 資料表中的記錄預設使用主鍵 一...