1. 程式人生 > >Mysql 分頁語句Limit用法

Mysql 分頁語句Limit用法

1、Mysql的limit用法

在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功能。

Sql程式碼  收藏程式碼
  1. SELECT * FROMtable LIMIT [offset,] rows | rows OFFSET offset  

LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 PostgreSQL 相容,MySQL 也支援句法: LIMIT # OFFSET #。

Sql程式碼  收藏程式碼
  1. mysql> SELECT * FROMtable LIMIT 5,10; // 檢索記錄行 6-15  
  2. //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:   
  3. mysql> SELECT * FROMtable LIMIT 95,-1; // 檢索記錄行 96-last.  
  4. //如果只給定一個引數,它表示返回最大的記錄行數目:   
  5. mysql> SELECT * FROMtable LIMIT 5; //檢索前 5 個記錄行  
  6. //換句話說,LIMIT n 等價於 LIMIT 0,n。  

2、Mysql的分頁查詢語句的效能分析

      MySql分頁sql語句,如果和MSSQL的TOP語法相比,那麼MySQL的LIMIT語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。

2.1最基本的分頁方式:

Sql程式碼  收藏程式碼
  1. SELECT ... FROM ... WHERE ... ORDERBY ... LIMIT ...  
  

在中小資料量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引:

舉例來說,如果實際SQL類似下面語句,那麼在category_id, id兩列上建立複合索引比較好:

Sql程式碼  收藏程式碼
  1. SELECT * FROM articles WHERE category_id = 123 ORDERBY id LIMIT 50, 10  
  

2.2子查詢的分頁方式:

隨著資料量的增加,頁數會越來越多,檢視後幾頁的SQL就可能類似:

Sql程式碼  收藏程式碼
  1. SELECT * FROM articles WHERE category_id = 123 ORDERBY id LIMIT 10000, 10  
  

一言以蔽之,就是越往後分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。

此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:

Sql程式碼  收藏程式碼
  1. SELECT * FROM articles WHERE  id >=  
  2.  (SELECT id FROM articles  WHERE category_id = 123 ORDERBY id LIMIT 10000, 1) LIMIT 10  
 

2.3JOIN分頁方式

Sql程式碼  收藏程式碼
  1. SELECT * FROM `content` AS t1   
  2. JOIN (SELECT id FROM `content` ORDERBY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2   
  3. WHERE t1.id <= t2.id ORDERBY t1.id desc LIMIT $pagesize;   
  

   經過我的測試,join分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。

explain SQL語句:

id select_type table type possible_keys key key_len ref rows Extra

1 PRIMARY <derived2> system NULL NULL NULL NULL 1  

1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where

2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

----------------------------------------

為什麼會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在資料檔案上完成的,通常來說,索引檔案要比資料檔案小得多,所以操作起來也會更有效率。

實際可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。

3、Oracle分頁查詢語句

Oralce資料庫 

從資料庫表中第M條記錄開始檢索N條記錄 

Sql程式碼  收藏程式碼
  1. SELECT * FROM (SELECT ROWNUM r,t1.* From 表名稱 t1 where rownum < M + N) t2   
  2.  where t2.r >= M   

  例如從表Sys_option(主鍵為sys_id)中從第10條記錄開始檢索20條記錄,語句如下: 

Sql程式碼  收藏程式碼
  1. SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2   
  2. Where t2.R >= 10   
  

3、MSSQLSERVER分頁查詢語句

SQL Server主要利用 SELECT TOP語句分頁,具體方案,請參考

------------------------------------- 

分頁方案一:(利用Not In和SELECT TOP分頁) 

語句形式: 

Sql程式碼  收藏程式碼
  1. SELECTTOP 10 *   
  2. FROM TestTable   
  3. WHERE (ID NOTIN
  4. (SELECTTOP 20 id   
  5. FROM TestTable   
  6. ORDERBY id))   
  7. ORDERBY ID   
    Sql程式碼  收藏程式碼
  1. SELECTTOP 頁大小 *   
  2. FROM TestTable   
  3. WHERE (ID NOTIN
  4. (SELECTTOP 頁大小*頁數 id   
  5. FROM 表   
  6. ORDERBY id))   
  7. ORDERBY ID   
  8. SELECTTOP 頁大小 *   
Sql程式碼  收藏程式碼
  1. FROM TestTable   
  2. WHERE (ID >   
  3. (SELECTMAX(id)   
  4. FROM (SELECTTOP 頁大小*頁數 id   
  5. FROM 表   
  6. ORDERBY id) AS T))   
  7. ORDERBY ID   
  

------------------------------------- 

分頁方案二:(利用ID大於多少和SELECT TOP分頁) 

語句形式: 

Sql程式碼  收藏程式碼
  1. SELECTTOP 10 *   
  2. FROM TestTable   
  3. WHERE (ID >   
  4. (SELECTMAX(id)   
  5. FROM (SELECTTOP 20 id   
  6. FROM TestTable   
  7. ORDERBY id) AS T))   
  8. ORDERBY ID   
  

------------------------------------- 

分頁方案三:(利用SQL的遊標儲存過程分頁) 

Sql程式碼  收藏程式碼
  1. createprocedure XiaoZhengGe   
  2. @sqlstr nvarchar(4000), --查詢字串 
  3. @currentpage int--第N頁 
  4. @pagesize int--每頁行數 
  5. as
  6. set nocount on
  7. declare @P1 int--P1是遊標的id 
  8. @rowcount int
  9. exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@[email protected] output
  10. select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁 
  11. set @currentpage=(@currentpage-1)*@pagesize+1   
  12. exec sp_cursorfetch @P1,16,@currentpage,@pagesize   
  13. exec sp_cursorclose @P1   
  14. set nocount off
  

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。 

建議優化的時候,加上主鍵和索引,查詢效率會提高。 

通過SQL 查詢分析器,顯示比較:我的結論是: 

分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高,需要拼接SQL語句 

分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句 

分頁方案三:(利用SQL的遊標儲存過程分頁) 效率最差,但是最為通用 

在實際情況中,要具體分析。

相關推薦

Mysql 語句Limit用法

1、Mysql的limit用法 在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功能。 Sql程式碼   SELECT * FROMtable LIMIT [offset,] rows 

Mysql 語句limit用法

一:在我們使用查詢語句的時候,有時會需要返回查詢結果的前幾條或中間幾天資料,此時我們就可以使用Mysql的Limit分頁語句; 語句原型如下: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset Li

mysql語句優化

覆蓋索引 通常開發人員會根據查詢的where條件建立合適的索引。 但是mysql可以使用索引來直接獲取列的資料,就不用回表查詢,也就是說這種索引包含(也稱覆蓋)所有需要查詢的欄位的值,就稱這種索引為覆蓋索引 利用表的覆蓋索引來加速分頁查詢 我們都知道,利用了索引查詢的語句中如果只包含

mysql 查詢limit中偏移量offset過大導致效能問題

      在業務中經常會遇到關於分頁的需求,這就會經常會用到MySQL中的limit offset,rows來分段取出每頁中需要的資料。但是當資料量足夠大的時候,limit條件中的偏移量offset越大就越會導致效能問題,導致查詢耗時增加嚴重。先看一下測試:

Mysql查詢limit逗號和offset 區別

SELECT  keyword  FROM  `keywords`  WHERE  id='59' ORDER BY   keyword  LIMIT 2  OFFSET 1; 比如這個SQL ,這裡表示的是從第一條資料(不包括第一條)開始讀取2條資料。 -----

mysql 語句

mysql 分頁 一種方式 select * from table where id <= (select id from t order by id desc limit 0,1) order by id limit 3; 第二種方式 select * from e

Mybatis3, 基於Mybatis Generator外掛生成MYSQL語句

http://ibatis.apache.org/docs/tools/ibator/reference/pluggingIn.html Mybatis Generator外掛物理分頁,適用於targetRuntime="MyBatis3" package com

Mysql,資料量大時limit優化

MYSQL的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。 同樣是取10條資料 select * from order limit 10000,10 select * from or

MySql SQL 大資料量limit替代和優化(試驗)

select SQL_NO_CACHE u.id, u.user_id, u.user_name, u.user_name_index, u.email, u.pwd, u.email_token, u.email_active_date, u.

mysql查詢語句怎麼寫?

是用limit函式 取前5條資料 select * from table_name limit 0,5  或者 select * from table_name limit 5  查詢第11到第15條資料 select * from table_name li

MYSQL語法,limit語法

1   為什麼要使用分頁        因為生產環境資料很多,一張表的資料量有時會達到幾百萬,不使用分頁會增加伺服器壓力,以及使用者體驗性2  MYSQL如何分頁    只要在原查詢語句基礎上加上 limit3  limit語法        1      limit放在SQ

關於SQLServer和MySQL 查詢語句區別

首先來定義幾個要用到的引數(例子) t_user資料表  int currentPage ; //當前頁 int pageRecord ; //每頁顯示記錄數 關於SqlServer資料庫   分頁SQL語句為:            String sql = "sel

mysql查詢語句

分頁需求: 前端通過傳遞start(頁碼),limit(每頁顯示的條數)兩個引數去分頁查詢資料庫表中的資料,MySql資料庫提供了分頁的函式limit m,n,其中m的引數是從第幾條記錄開始,n

資料庫學習--mysql 查詢語句

 單條 SQL 語句的分頁 SQL 方法1: 適用於 SQL Server 2000/2005 SELECT TOP 頁大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 頁大小*(頁數-1) id FROM table1 ORD

MYSQLlimit速度太慢優化方法

在mysql中limit可以實現快速分頁,但是如果資料到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的伺服器哦。當一個表資料有幾百萬的資料的時候成了問題!如 * from table limit 0,10 這個沒有問題 當 limit 2000

常用sql 語句(Oracle)

part strong spa 數據 rac syntax tween 另類 排序 常用的Oracle查詢語句 1.無ORDER BY排序的寫法。(效率最高) 經過測試,此方法成本最低,只嵌套一層,速度最快!即使查詢的數據量再大,也幾乎不受影響,速度依然! sql語句如下:

MySQL優化中的“INNER JOIN方式優化算法”到底在什麽情況下會生效?

表結構 files key 效率 ref 兩個 ges 參考 如果 本文出處:http://www.cnblogs.com/wy123/p/7003157.html 最近無意間看到一個MySQL分頁優化的測試案例,並沒有非常具體地說明測試場景的情況下,給出了

PHP+MySQL顯示示例分析

moc dwl _array t-sql 4g+ scw zax d+ ffi Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與數據庫打交道,客戶端從服務器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個

Oracle中語句的寫法

where select sql span -s light 語句 emp pre select empno,ename,r from (select empno,ename,rownum r from emp) where r<11 and r>4

Mysql處理(PageHelper)

展示 文件中 感覺 但是 pre 模糊查詢 map art lec 第一次做分頁處理(完全不知道分頁處理到底要做成什麽樣?) 理解:其實就是前臺頁面通過傳遞不同的參數{1.查詢的條件。2.查詢頁數(pageNum),3每頁展現的條數(pageSize)},之後我們(只做後臺