MySQL中SQL分頁查詢的幾種實(shí)現(xiàn)方法及優(yōu)缺點(diǎn)
【SQL】SQL分頁查詢總結(jié)
開發(fā)過程中經(jīng)常遇到分頁的需求,今天在此總結(jié)一下吧。
簡單說來方法有兩種,一種在源上控制,一種在端上控制。源上控制把分頁邏輯放在SQL層;端上控制一次性獲取所有數(shù)據(jù),把分頁邏輯放在UI上(如GridView)。顯然,端上控制開發(fā)難度低,適于小規(guī)模數(shù)據(jù),但數(shù)據(jù)量增大時(shí)性能和IO消耗無法接受;源上控制在性能和開發(fā)難度上較為平衡,適應(yīng)大多數(shù)業(yè)務(wù)場景;除此之外,還可以根據(jù)客觀情況(性能要求,源與端的資源占用等)在源和端之間加一層,應(yīng)用特殊算法和技術(shù)進(jìn)行處理。以下主要討論源上,即SQL上的分頁。
分頁的問題其實(shí)就是在滿足條件的一堆有序數(shù)據(jù)中截取當(dāng)前所需要展示的那部分。實(shí)際上各種數(shù)據(jù)庫都考慮到分頁問題而內(nèi)置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我們可以得到一系列分頁的方法。
1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回區(qū)間(以MySql為例,注意使用Oracle的ROWNUM時(shí)要應(yīng)用子查詢):
方法一、直接限制返回區(qū)間
SELECT * FROM table WHERE 查詢條件 ORDER BY 排序條件 LIMIT ((頁碼-1)*頁大小),頁大小;
優(yōu)點(diǎn):寫法簡單。
缺點(diǎn):當(dāng)頁碼和頁大小過大時(shí),性能明顯下降。
適用:數(shù)據(jù)量不大。
2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他們可以限制返回的行數(shù),因此可以得到以下兩套通用的方法(以SqlServer為例):
方法二、NOT IN
SELECT TOP 頁大小 * FROM table WHERE 主鍵 NOT IN ( SELECT TOP (頁碼-1)*頁大小 主鍵 FROM table WHERE 查詢條件 ORDER BY 排序條件 ) ORDER BY 排序條件
優(yōu)點(diǎn):通用性強(qiáng)。
缺點(diǎn):當(dāng)數(shù)據(jù)量較大時(shí)向后翻頁,NOT IN中的數(shù)據(jù)過大會(huì)影響性能。
適用:數(shù)據(jù)量不大。
方法三、MAX
SELECT TOP 頁大小 * FROM table WHERE 查詢條件 AND id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP ((頁碼-1)*頁大小) id FROM table WHERE 查詢條件 ORDER BY id ) AS tempTable ) ORDER BY id
優(yōu)點(diǎn):速度快,特別是當(dāng)id為主鍵時(shí)。
缺點(diǎn):適用面窄,要求排序條件單一且可比較。
適用:簡單排序(特殊情況也可嘗試轉(zhuǎn)換成類似可比較值處理)。
3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回?cái)?shù)據(jù)的行號(hào),基于此在限制返回區(qū)間得到如下方法(以SqlServer為例):
方法四、ROW_NUMBER()
SELECT TOP 頁大小 * FROM ( SELECT TOP (頁碼*頁大小) ROW_NUMBER() OVER (ORDER BY 排序條件) AS RowNum, * FROM table WHERE 查詢條件 ) AS tempTable WHERE RowNum BETWEEN (頁碼-1)*頁大小+1 AND 頁碼*頁大小 ORDER BY RowNum
優(yōu)點(diǎn):在數(shù)據(jù)量較大時(shí)相比NOT IN有優(yōu)勢。
缺點(diǎn):小數(shù)據(jù)量時(shí)不如NOT IN。
適用:大部分分頁查詢需求。
以上是自己總結(jié)的拙見,性能比較來自網(wǎng)上資料及個(gè)人判斷,并沒有深入實(shí)驗(yàn),不當(dāng)之處請(qǐng)大家指正。
到此這篇關(guān)于MySQL中分頁查詢的幾種實(shí)現(xiàn)方法及優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)MySQL中分頁查詢的方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家
相關(guān)文章
mysql 直接拷貝data 目錄下文件還原數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了mysql 直接拷貝data 目錄下文件還原數(shù)據(jù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Mysql 默認(rèn)字符集設(shè)置方法(免安裝版)
有些時(shí)候我們?cè)谑褂梅前惭b版的mysql是需要設(shè)置默認(rèn)字符集的時(shí)候,就需要這樣的修改了。安裝版的可以選擇的。2009-03-03MySQL詳細(xì)講解多表關(guān)聯(lián)查詢
在數(shù)據(jù)庫的設(shè)計(jì)中, 我們通常都是會(huì)有很多張表 , 通過表與表之間的關(guān)系建立我們想要的數(shù)據(jù)關(guān)系, 所以在多張表的前提下, 多表的關(guān)聯(lián)查詢就尤為重要2022-04-04VS2019連接mysql8.0數(shù)據(jù)庫的教程圖文詳解
這篇文章主要介紹了VS2019連接mysql8.0數(shù)據(jù)庫的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05關(guān)于MySQL的索引之最左前綴優(yōu)化詳解
這篇文章主要介紹了關(guān)于MySQL的索引之最左前綴優(yōu)化詳解,多個(gè)普通字段組合在一起創(chuàng)建的索引叫做聯(lián)合索引, 也被稱之為組合索引,需要的朋友可以參考下2023-05-05mysql 遠(yuǎn)程連接數(shù)據(jù)庫的方法集合
MySQL數(shù)據(jù)庫不允許從遠(yuǎn)程訪問怎么辦?本文提供了三種解決方法:2008-03-03Java連接mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢的方法
下面小編就為大家?guī)硪黄狫ava連接mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10如何優(yōu)雅安全的備份MySQL數(shù)據(jù)
這篇文章主要介紹了如何優(yōu)雅安全的備份MySQL數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-10-10