Mysql 分頁語句Limit用法
1、Mysql的limit用法
在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功能。
Sql程式碼- SELECT * FROMtable LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 PostgreSQL 相容,MySQL 也支援句法: LIMIT # OFFSET #。
- mysql> SELECT * FROMtable LIMIT 5,10; // 檢索記錄行 6-15
- //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:
- mysql> SELECT * FROMtable LIMIT 95,-1; // 檢索記錄行 96-last.
- //如果只給定一個引數,它表示返回最大的記錄行數目:
- mysql> SELECT * FROMtable LIMIT 5; //檢索前 5 個記錄行
- //換句話說,LIMIT n 等價於 LIMIT 0,n。
2、Mysql的分頁查詢語句的效能分析
MySql分頁sql語句,如果和MSSQL的TOP語法相比,那麼MySQL的LIMIT語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。
2.1最基本的分頁方式:
Sql程式碼- SELECT ... FROM ... WHERE ... ORDERBY ... LIMIT ...
在中小資料量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引:
舉例來說,如果實際SQL類似下面語句,那麼在category_id, id兩列上建立複合索引比較好:
Sql程式碼- SELECT * FROM articles WHERE category_id = 123 ORDERBY id LIMIT 50, 10
2.2子查詢的分頁方式:
隨著資料量的增加,頁數會越來越多,檢視後幾頁的SQL就可能類似:
- SELECT * FROM articles WHERE category_id = 123 ORDERBY id LIMIT 10000, 10
一言以蔽之,就是越往後分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。
此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:
Sql程式碼- SELECT * FROM articles WHERE id >=
- (SELECT id FROM articles WHERE category_id = 123 ORDERBY id LIMIT 10000, 1) LIMIT 10
2.3JOIN分頁方式
Sql程式碼- SELECT * FROM `content` AS t1
- JOIN (SELECT id FROM `content` ORDERBY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
- 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程式碼- SELECT * FROM (SELECT ROWNUM r,t1.* From 表名稱 t1 where rownum < M + N) t2
- where t2.r >= M
例如從表Sys_option(主鍵為sys_id)中從第10條記錄開始檢索20條記錄,語句如下:
Sql程式碼- SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2
- Where t2.R >= 10
3、MSSQLSERVER分頁查詢語句
SQL Server主要利用 SELECT TOP語句分頁,具體方案,請參考
-------------------------------------
分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:
Sql程式碼- SELECTTOP 10 *
- FROM TestTable
- WHERE (ID NOTIN
- (SELECTTOP 20 id
- FROM TestTable
- ORDERBY id))
- ORDERBY ID
- SELECTTOP 頁大小 *
- FROM TestTable
- WHERE (ID NOTIN
- (SELECTTOP 頁大小*頁數 id
- FROM 表
- ORDERBY id))
- ORDERBY ID
- SELECTTOP 頁大小 *
- FROM TestTable
- WHERE (ID >
- (SELECTMAX(id)
- FROM (SELECTTOP 頁大小*頁數 id
- FROM 表
- ORDERBY id) AS T))
- ORDERBY ID
-------------------------------------
分頁方案二:(利用ID大於多少和SELECT TOP分頁)
語句形式:
Sql程式碼- SELECTTOP 10 *
- FROM TestTable
- WHERE (ID >
- (SELECTMAX(id)
- FROM (SELECTTOP 20 id
- FROM TestTable
- ORDERBY id) AS T))
- ORDERBY ID
-------------------------------------
分頁方案三:(利用SQL的遊標儲存過程分頁)
Sql程式碼- createprocedure XiaoZhengGe
- @sqlstr nvarchar(4000), --查詢字串
- @currentpage int, --第N頁
- @pagesize int--每頁行數
- as
- set nocount on
- declare @P1 int, --P1是遊標的id
- @rowcount int
- exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@[email protected] output
- select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁
- set @currentpage=(@currentpage-1)*@pagesize+1
- exec sp_cursorfetch @P1,16,@currentpage,@pagesize
- exec sp_cursorclose @P1
- 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
MYSQL分頁limit速度太慢優化方法
在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)},之後我們(只做後臺