最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在MySQL中使用LIMIT進行分頁的方法

 更新時間:2015年05月11日 09:11:44   作者:吳炳錫  
這篇文章主要介紹了在MySQL中使用LIMIT進行分頁的方法,作者列舉出了三種方法,并且針對跳頁等常見問題做出了提示,需要的朋友可以參考下

今天看一個水友說他的MySQL現(xiàn)在變的很慢。問什么情況時。說單表超過2個G的一個MyISAM。真垃圾的回答方式。

    簡單答復(fù):換一個強勁的服務(wù)器。換服務(wù)器很管用的:)

………
       最終讓取到慢查詢:
 

  SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N;
 
  SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N;

如:
   

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
 
  SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;

        看到這個語句我都吐血了(BT的PHPWIND分頁啊,這個語句是PHP初學(xué)者寫出來的還正常,但PHPWIND那么成熟的社區(qū)了還有這樣的問題)。
        我這里簡單說一下LIMIT的原理。這里以LIMIT N,M為基礎(chǔ):LIMIT首先要找查N+M行,然后從N行處,取M行。那么這樣的SQL對一次查詢1275500一個操作應(yīng)該是一個昂貴的開銷。對于LIMIT這類的優(yōu)化,第一個目標就是讓N變的盡可能的小或是不用。
     怎么才能使這個N盡可能小呢。我們能做的其實就是用相對的值,給分頁一個提示。如現(xiàn)在我們看的是第5頁,看完看想看第6頁,第6頁同樣顯示是20條記錄。我們就可以想到,以這個例子為準:我們可以肯定的是第6頁的日值應(yīng)小于第5頁的,如果第5頁的最小日值為:2009-11-4,那我們就可以用:
    

SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20;
 
   SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20;

這樣來查詢第6頁的內(nèi)容。同樣對于查看第4頁的內(nèi)容(假設(shè)第5頁的最大日期為:2009-11-3)則第4頁的內(nèi)容為:
 

  SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20;


   SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20;

         這是一個基本的思想。接下來討論一下怎么展現(xiàn)的問題。

         再說一下這種業(yè)務(wù)的SQL怎么實現(xiàn):對于分頁的展示可以用多用類型。這里說三種常用的類型:

第一種:顯示“上一頁” “下一頁”這種類型

         這種方式相對簡單也就出現(xiàn)了我們看到那種SQL不思考的寫法。合理的做法:

         第一頁:
     

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
 
   SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;

         第二頁:根據(jù)第一頁的postdate進行查詢?nèi)纾?br />       SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;
 
      SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;

         為什么說這個簡單呢,這個不存在跳頁的問題。接下來這種就存在一個跳頁的問題了。

第二種:顯示 “ 1,2,3,4,5…”

         第一頁: 還是以第一頁的方式實現(xiàn):
        

 SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;
 
     SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;

         第二頁:和原來一樣。如果跳頁,如從第二頁跳到第5頁,這里有一個第二頁的最小日期為:2009-11-3(假設(shè)值,可以由第二頁的程序查詢得到),第二到第5,差2頁,每頁20條記錄,那么就可以用:

SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;


SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;

        看到這里明白為什么大型網(wǎng)站的分頁不是一下標識出來完了,讓都能點了吧。也不會給你一個框讓你輸入一個頁跳過去了。如果跳的頁面過多,也就存在N值過大的問題了。所以要想辦法必免。

第三種:顯示 “1,2,3,4,5,…. 末頁” 或是 “首頁,<<100,101,102,103 >>末頁”

這里有一個特殊的一地方:

別的頁面的跳轉(zhuǎn)的上面一樣。這里就加一個末頁,這里又分兩種情況,如果知道最后一頁是多少頁,也就知道了前一頁的最小日期(分頁提示值),這樣就可以用上面的方法查看最后一頁的內(nèi)容(會出現(xiàn)不足20條的現(xiàn)象),另一種,我就不知道最后是第幾頁,我就是想看看最后什么樣子,那么就可以用(一定是顯示20條):

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20;
 
SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20;

         首頁這里就不在說了。

       

         具體怎么實現(xiàn)搞明白了,就可以做PHP代碼的修改了。稍稍修改一下,就會帶來意想不到的效果。

 

這里只是一個通用的分頁處理方法。不同的業(yè)務(wù)有可能還有不同的方法處理。如果在條件可能和情況可以考用:between … and .. 帶代替limit分頁操作。

第三種方法:       
簡單的邏輯轉(zhuǎn)換。
  

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;
 
  SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;

轉(zhuǎn)換成:
  

SELECT * FROM pw_gbook WHERE id>1275480 and uid='48' ORDER BY postdate DESC LIMIT 20;
 
  SELECT * FROM pw_gbook WHERE id>1275480 and uid='48' ORDER BY postdate DESC LIMIT 20;

相關(guān)文章

  • mysql 遠程連接數(shù)據(jù)庫的方法集合

    mysql 遠程連接數(shù)據(jù)庫的方法集合

    MySQL數(shù)據(jù)庫不允許從遠程訪問怎么辦?本文提供了三種解決方法:
    2008-03-03
  • MySQL索引長度限制原理解析

    MySQL索引長度限制原理解析

    這篇文章主要介紹了MySQL索引長度限制原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-12-12
  • MySQL普通表如何轉(zhuǎn)換成分區(qū)表

    MySQL普通表如何轉(zhuǎn)換成分區(qū)表

    分表和表分區(qū)的目的就是減少數(shù)據(jù)庫的負擔,提高數(shù)據(jù)庫的效率,通常點來講就是提高表的增刪改查效率,下面這篇文章主要給大家介紹了關(guān)于MySQL普通表如何轉(zhuǎn)換成分區(qū)表的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程

    MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程

    通常,在InnoDB存儲引擎下,一個表由三部分組成:數(shù)據(jù)字典(.frm文件)、表空間(.ibd文件)和日志文件,其中,.frm文件存儲了表的定義,.ibd文件存儲了表的數(shù)據(jù)和索引,本文給大家記錄一次MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程,需要的朋友可以參考下
    2024-10-10
  • 配置Mysql主從服務(wù)實現(xiàn)實例

    配置Mysql主從服務(wù)實現(xiàn)實例

    這篇文章主要介紹了配置Mysql主從服務(wù)實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • MySQL遷移中explicit_defaults_for_timestamp參數(shù)影響

    MySQL遷移中explicit_defaults_for_timestamp參數(shù)影響

    在MySQL數(shù)據(jù)庫遷移過程中,explicit_defaults_for_timestamp參數(shù)設(shè)置為off可能導(dǎo)致數(shù)據(jù)寫入行為變化,本文就來介紹一下explicit_defaults_for_timestamp參數(shù)影響,感興趣的可以了解一下
    2024-09-09
  • mysql配置文件的使用教程

    mysql配置文件的使用教程

    這篇文章主要介紹了mysql配置文件的使用教程,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • mysql出現(xiàn)提示錯誤10061的解決方法

    mysql出現(xiàn)提示錯誤10061的解決方法

    這篇文章主要為大家詳細介紹了mysql出現(xiàn)提示錯誤10061的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • mysql回表致索引失效案例講解

    mysql回表致索引失效案例講解

    這篇文章主要介紹了mysql回表致索引失效案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Mysql數(shù)據(jù)庫高級用法之視圖、事務(wù)、索引、自連接、用戶管理實例分析

    Mysql數(shù)據(jù)庫高級用法之視圖、事務(wù)、索引、自連接、用戶管理實例分析

    這篇文章主要介紹了Mysql數(shù)據(jù)庫高級用法之視圖、事務(wù)、索引、自連接、用戶管理,結(jié)合實例形式分析了MySQL數(shù)據(jù)庫視圖、事務(wù)、索引、自連接、用戶管理常見用法及操作注意事項,需要的朋友可以參考下
    2019-11-11

最新評論

石城县| 巩义市| 永平县| 精河县| 尉犁县| 亚东县| 洛阳市| 屏边| 武宣县| 祁东县| 连云港市| 阿合奇县| 淮滨县| 新和县| 招远市| 盐津县| 长治市| 黄平县| 沁源县| 平阴县| 哈巴河县| 湖州市| 桐柏县| 贞丰县| 新平| 西丰县| 邓州市| 潜江市| 三江| 涿州市| 南通市| 松滋市| 大田县| 永川市| 翼城县| 乌审旗| 东山县| 青浦区| 方山县| 精河县| 岑巩县|