2009-07-05 44 views
0

我有一個網站,可以讓人們查看錶中的行(每一行都是圖片)。有超過10萬行。您可以查看行的不同子集,並可以使用不同的排序順序查看它們。在查看其中一行時,您可以單擊「下一步」或「上一步」按鈕來轉到列表中的下一個/上一個行。MySQL結果集上Next按鈕的高效算法

您將如何實現網站的「下一步」和「以前」功能?

更具體地說,如果您有一個任意查詢返回一個最多100,000行的列表,並且您知道某人正在查看的當前行的某些信息,那麼您如何有效地確定NEXT行?

這是我在網站年輕時提出的解決方案的僞代碼,當只有1000行時它運行良好,但現在有100,000行,我認爲它消耗了太多的內存。

int nextRowId(string query, int currentRowId) 
{ 
    array allRowIds = mysql_query(query); // Takes up a lot of memory! 
    int currentIndex = (index of currentRowId in allRowIds); // Takes time! 
    return allRowIds[currentIndex+1]; 
} 

當你在思考這個問題,請記住,該網站將不只是它的ID存儲更多的信息,關於當前行(例如,當前行的結果集中的位置),並將此信息可以用作提示來幫助確定下一行的ID。

編輯:對不起,不提此以前,但這不只是一個靜態的網站:行通常可以添加到列表中,並在列表行可以被重新排序。 (更爲罕見的是,行可以從列表中刪除。)我認爲我應該擔心這種事情,但也許你可以說服我。

回答

0

使用mysql限制條款。 與select * from tableA limit 0,100;

您自然參數化0和100,將它們存儲爲表單或無論您需要什麼,以便您知道用戶點擊下一步時使用的偏移量。這將要求您爲每個渲染的下一頁/上一頁重新運行查詢。

+0

感謝您的回答!請看我對Machine的回答的看法,因爲它們都適用於你的回答。 – 2009-07-07 06:32:26

4

您是否嘗試過將LIMIT-clause用於查詢?

從MySQL手冊

LIMIT子句可以被用來限制SELECT語句返回的行數。 LIMIT需要一個或兩個數字參數,它們都必須是非負整數常量(除了使用預準備語句時)。

在有兩個參數,第一參數指定第一行到返回的偏移量,和第二個指定的最大行數,返回

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 

帶一個參數,該值指定

SELECT * FROM tbl LIMIT 5;  # Retrieve first 5 rows 
+0

限制是真正的唯一途徑去分頁瀏覽網站上的列表。 – 2009-07-05 00:58:49