《Mysql學(xué)習(xí)在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法》要點(diǎn):
本文介紹了Mysql學(xué)習(xí)在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本日看一個(gè)水友說(shuō)他的MySQL現(xiàn)在變的很慢.問(wèn)什么情況時(shí).說(shuō)單表超過(guò)2個(gè)G的一個(gè)MyISAM.真垃圾的回答方式.MYSQL應(yīng)用
??? 簡(jiǎn)單答復(fù):換一個(gè)強(qiáng)勁的服務(wù)器.換服務(wù)器很管用的:)MYSQL應(yīng)用
………
?????? 最終讓取到慢查詢:
?MYSQL應(yīng)用
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;
如:
???MYSQL應(yīng)用
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é)者寫(xiě)出來(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è)昂貴的開(kāi)銷(xiāo).對(duì)于LIMIT這類(lèi)的優(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,那我們就可以用:
????MYSQL應(yīng)用
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)容為:
?MYSQL應(yīng)用
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)題.MYSQL應(yīng)用
???????? 再說(shuō)一下這種業(yè)務(wù)的SQL怎么實(shí)現(xiàn):對(duì)于分頁(yè)的展示可以用多用類(lèi)型.這里說(shuō)三種常用的類(lèi)型:MYSQL應(yīng)用
第一種:顯示“上一頁(yè)” “下一頁(yè)”這種類(lèi)型MYSQL應(yīng)用
???????? 這種方式相對(duì)簡(jiǎn)單也就呈現(xiàn)了我們看到那種SQL不思考的寫(xiě)法.合理的做法:MYSQL應(yīng)用
???????? 第一頁(yè):
?????MYSQL應(yīng)用
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;MYSQL應(yīng)用
???????? 為什么說(shuō)這個(gè)簡(jiǎn)單呢,這個(gè)不存在跳頁(yè)的問(wèn)題.接下來(lái)這種就存在一個(gè)跳頁(yè)的問(wèn)題了.MYSQL應(yīng)用
第二種:顯示 “ 1,2,3,4,5…”MYSQL應(yīng)用
???????? 第一頁(yè): 還是以第一頁(yè)的方式實(shí)現(xiàn):
????????MYSQL應(yīng)用
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條記錄,那么就可以用:
MYSQL應(yīng)用
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)題了.所以要想方法必免.MYSQL應(yīng)用
第三種:顯示 “1,2,3,4,5,…. 末頁(yè)” 或是 “首頁(yè),<<100,101,102,103 >>末頁(yè)”MYSQL應(yīng)用
這里有一個(gè)特殊的一處所:MYSQL應(yīng)用
《Mysql學(xué)習(xí)在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法》是否對(duì)您有啟發(fā),歡迎查看更多與《Mysql學(xué)習(xí)在MySQL中使用LIMIT進(jìn)行分頁(yè)的方法》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/12868.html