亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法

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

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

    簡(jiǎn)單答復(fù):換一個(gè)強(qiáng)勁的服務(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;

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

這樣來(lái)查詢第6頁(yè)的內(nèi)容。同樣對(duì)于查看第4頁(yè)的內(nèi)容(假設(shè)第5頁(yè)的最大日期為:2009-11-3)則第4頁(yè)的內(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;

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

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

第一種:顯示“上一頁(yè)” “下一頁(yè)”這種類型

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

         第一頁(yè):
     

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;

         第二頁(yè):根據(jù)第一頁(yè)的postdate進(jìn)行查詢?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;

         為什么說(shuō)這個(gè)簡(jiǎn)單呢,這個(gè)不存在跳頁(yè)的問(wèn)題。接下來(lái)這種就存在一個(gè)跳頁(yè)的問(wèn)題了。

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

         第一頁(yè): 還是以第一頁(yè)的方式實(shí)現(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;

         第二頁(yè):和原來(lái)一樣。如果跳頁(yè),如從第二頁(yè)跳到第5頁(yè),這里有一個(gè)第二頁(yè)的最小日期為:2009-11-3(假設(shè)值,可以由第二頁(yè)的程序查詢得到),第二到第5,差2頁(yè),每頁(yè)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)站的分頁(yè)不是一下標(biāo)識(shí)出來(lái)完了,讓都能點(diǎn)了吧。也不會(huì)給你一個(gè)框讓你輸入一個(gè)頁(yè)跳過(guò)去了。如果跳的頁(yè)面過(guò)多,也就存在N值過(guò)大的問(wèn)題了。所以要想辦法必免。

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

這里有一個(gè)特殊的一地方:

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

         首頁(yè)這里就不在說(shuō)了。

       

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

 

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

第三種方法:       
簡(jiǎn)單的邏輯轉(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中varchar長(zhǎng)度設(shè)置方法

    Mysql中varchar長(zhǎng)度設(shè)置方法

    這篇文章主要介紹了Mysql中varchar長(zhǎng)度設(shè)置方法的相關(guān)資料,本文還給大家?guī)?lái)了valar類型的變化及char()和varchar()的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 基于MySQL游標(biāo)的具體使用詳解

    基于MySQL游標(biāo)的具體使用詳解

    本篇文章是對(duì)MySQL游標(biāo)的具體使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 全面分析MySQL?ERROR?1045出現(xiàn)的原因及解決

    全面分析MySQL?ERROR?1045出現(xiàn)的原因及解決

    這篇文章主要介紹了全面分析MySQL?ERROR?1045出現(xiàn)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用MySQL的LAST_INSERT_ID來(lái)確定各分表的唯一ID值

    使用MySQL的LAST_INSERT_ID來(lái)確定各分表的唯一ID值

    MySQL數(shù)據(jù)表結(jié)構(gòu)中,一般情況下,都會(huì)定義一個(gè)具有‘AUTO_INCREMENT’擴(kuò)展屬性的‘ID’字段,以確保數(shù)據(jù)表的每一條記錄都可以用這個(gè)ID唯一確定
    2011-08-08
  • 一文帶你了解MySQL基于規(guī)則的優(yōu)化

    一文帶你了解MySQL基于規(guī)則的優(yōu)化

    MySQL依據(jù)一些規(guī)則,竭盡全力的把這些很糟糕的語(yǔ)句轉(zhuǎn)換成某種可以比較高效執(zhí)行的形式,這個(gè)過(guò)程也可以被稱作查詢重寫,本章主要就是詳細(xì)講解下這些比較重要的重寫規(guī)則,感興趣的小伙伴可跟著小編一起來(lái)學(xué)習(xí)
    2023-05-05
  • MySQL8.0新特性之支持原子DDL語(yǔ)句

    MySQL8.0新特性之支持原子DDL語(yǔ)句

    這MySQL 8.0開始支持原子數(shù)據(jù)定義語(yǔ)言(DDL)語(yǔ)句。此功能稱為原子DDL。這篇文章主要介紹了MySQL8.0新特性——支持原子DDL語(yǔ)句,需要的朋友可以參考下
    2018-07-07
  • Windows7下如何在命令行使用MySQL

    Windows7下如何在命令行使用MySQL

    這篇文章主要介紹了Windows7下如何在命令行使用MySQL的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • mysql 日期和時(shí)間格式轉(zhuǎn)換實(shí)現(xiàn)語(yǔ)句

    mysql 日期和時(shí)間格式轉(zhuǎn)換實(shí)現(xiàn)語(yǔ)句

    對(duì)于每個(gè)類型擁有的值范圍以及并且指定日期何時(shí)間值的有效格式的描述見7.3.6 日期和時(shí)間類型。
    2009-10-10
  • MySQLJSON索引用法舉例簡(jiǎn)單介紹

    MySQLJSON索引用法舉例簡(jiǎn)單介紹

    索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序),這篇文章主要給大家介紹了關(guān)于MySQLJSON索引用法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 解決mysql不能插入中文Incorrect string value

    解決mysql不能插入中文Incorrect string value

    首先我的配置文件的設(shè)置的默認(rèn)字符集是utf8即
    2009-05-05

最新評(píng)論