2011-09-19 48 views
1

我需要分析一組可能/將會變大的模型。結果必須進行排序,以便最新的條目是出現在第一頁上的條目(然後,我們可以使用'下一個'鏈接一路走到最前面)。這種類型的分頁規模是多少?

檢索第一頁中查詢以下,4是我每頁需要的條目數:

SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_id = 1) ORDER BY created_at DESC LIMIT 4 OFFSET 0; 

因爲這需要進行排序,自條目數有可能變大,我是否會遇到嚴重的性能問題?

我的選擇是什麼讓它更快?

我的理解是,'followed_id'的索引只會幫助where子句。我關心的是

回答

1

「按訂單」上創建一個包含順序(followed_id, created_at)

這兩個領域現在的指標,有多大,我們都在談論這裏的大?如果這將是數以百萬計的量級。如何對類似下面的一個..

創建上的鍵followed_id, created_at, id索引(這可能取決於在選擇,地點和ORDER BY子句。我有場改變量身定製的這對您的問題)

SELECT relationships.* 
FROM relationships 
JOIN (SELECT id 
     FROM relationships 
     WHERE followed_id = 1 
     ORDER BY created_at 
     LIMIT 10 OFFSET 10) itable 
ON relationships.id = itable.id 
ORDER BY relationships.created_at 

的解釋會產生這樣的:

+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+ 
| id | select_type | table   | type | possible_keys | key   | key_len | ref | rows | Extra            | 
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+ 
| 1 | PRIMARY  | NULL   | NULL | NULL   | NULL  | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables | 
| 2 | DERIVED  | relationships | ref | sample_rel2 | sample_rel2 | 5  |  | 1 | Using where; Using index       | 
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+ 

如果你仔細檢查,包含訂單,限制子查詢和偏移的條款將在指數運行直接而不是表格最後加入表格來獲取10條記錄。

它有一個區別,當你的查詢撥打limit 10 offset 10000。它將從表中檢索所有10000條記錄並獲取前10個。這個技巧應該將遍歷限制在索引處。

重要說明:我在MySQL中測試了這個。其他數據庫在行爲上可能有細微的差異,但無論如何,這個概念都很好。

1

你可以索引這些字段。但它取決於: 您可以假設(主要)已經預訂了created_at。所以這可能是不必要的。但更多取決於你的應用程序。

無論如何,你應該索引followed_id(除非它的主鍵)