2011-12-29 45 views
1

我只是想在YouTube以下查詢:分頁搜索... N記錄後性能是否嚴重下降?

http://www.youtube.com/results?search_query=test&search=tag&page=100

,並收到錯誤消息:

很抱歉,YouTube不會提供超過1000個結果對任何查詢。 (您要求從2000年開始結果)

我也嘗試過谷歌搜索「測試」,雖然它說,有大約3.44十億的結果,我只能去82頁(或約820結果)。

這讓我很想知道,在N個記錄之後,分段搜索的性能是否會開始下降(特別是在SQL Server中使用ROW_NUMBER()或其他數據庫系統中的類似功能),或者YouTube/Google正在爲其他數據庫原因是什麼?誠然,大多數人都不太可能需要超過前1000個查詢結果,但我想這個限制是出於某種技術原因專門設置的。 https://stackoverflow.com/questions/tagged/c?page=955&sort=newest&pagesize=50

+0

看看這個http://www.percona.com/ppc2009/PPC2009_mysql_pagination.pdf – 2011-12-31 12:22:24

回答

1

是的。高偏移量速度慢,效率低。

在偏移量處查找記錄的唯一方法是計算之前出現的所有記錄,然後丟棄它們。

(我不知道ROW_NUMBER(),但將是標準的SQL限制。所以

SELECT * FROM table LIMIT 1999,20 

。在上述〔實施例中,前2000條記錄,必須先取出,然後丟棄。通常它不能跳過,或者使用索引直接跳到數據中的正確位置,因爲通常會有'WHERE'cluse過濾結果。

緩存結果是可能的,這可能是SO所做的。所以它不必每次都計算大的偏移量。 (SO的大部分搜索都是已知標記的「小」集合,因此緩存是非常可行的。一個arbitary搜索查詢會產生多大的版本趕上,不實用) (Alternativly它可能會使用一些其他的實現,它允許arbitary偏移)

其它地方採取有關類似的事情 http://sphinxsearch.com/docs/current.html#conf-max-matches

後退在envolope測試:

mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 100999,3; 
... 
3 rows in set (11.32 sec) 

mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 3; 
... 
3 rows in set (4.59 sec) 

(Arbitary查詢choosen以免使用索引非常好,如果索引可以使用的差異不太明顯,更難以看到,但在生產系統上運行大量的查詢,1。或2ms差異e是巨大的)

更新:(對一個索引查詢)

mysql> select gridimage_id from gridimage_search order by imagetaken limit 10; 
... 
10 rows in set (0.00 sec) 

mysql> select gridimage_id from gridimage_search order by imagetaken limit 100000,10; 
... 
10 rows in set (1.70 sec) 
+0

因此,即使按索引列排序,高偏移量也會有很大的性能損失? – 2011-12-31 02:23:00

+0

已更新,以添加使用索引的查詢的示例。 – barryhunter 2011-12-31 18:00:39

0

這是旨在限制物理量的TOP子句讀取數據庫必須執行,這限制了時間的查詢需要的量:

話又說回來堆棧溢出通過47K的結果可以讓你的頁面。想象一下,在你的數據庫中有820億條關於「日本」的故事鏈接。如果有人詢問「日本」怎麼辦?所有820億結果真的會被點擊嗎?不需要。用戶需要1000個最相關的結果。如果搜索是通用的,比如「測試」,則無法確定相關性。在這種情況下,YouTube/Google必須限制返回的音量,以便其他用戶不受通用搜索的影響。更快的是,返回1,000個結果還是8200萬個結果?

+0

是的,但你不返回全部金額,您將返回它的一個子集。我的問題是,在規模爲N的一組規格中,從第50個十億開始返回50條記錄,是否會比從第100個位置開始有更大的性能損失? – 2011-12-30 05:19:33