2011-12-29 4 views
1

私はYouTubeで次のクエリを試みた:ページ単位の検索... Nレコードの後に​​パフォーマンスが大幅に低下しますか?

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

をし、エラーメッセージ受信:申し訳ありませんが、YouTubeは任意のクエリのために1000の以上の結果を提供していない

を。 私はまた、「テスト」のためのGoogle検索を試みたが、それはおよそ34.4億結果があったと述べたが、私は唯一の82ページに取得することができた(または約

を(あなたが2000年から始めて結果を求めました) 820件の結果)。

これは、N個のレコード(特にSQL ServerのROW_NUMBER()や他のDBシステムの類似機能について不思議に思う)の後のページ単位の検索でパフォーマンスが低下するかどうか、またはYouTube/Googleが他の理由は?確かに、ほとんどの人がクエリの最初の1000件の結果を通過する必要はほとんどありませんが、何らかの技術的理由でこの制限が具体的に行われていると思います。それは物理的な量は、データベースがクエリにかかる時間の量を制限する、実行するために持っていることを読み取っ制限するように設計TOP句だhttps://stackoverflow.com/questions/tagged/c?page=955&sort=newest&pagesize=50

+0

これを見てみましょうhttp://www.percona.com/ppc2009/PPC2009_mysql_pagination.pdf –

答えて

1

はい。高いオフセットは遅く、非効率的です。

オフセットでレコードを見つける唯一の方法は、以前に来たすべてのレコードを計算して破棄することです。

は(私は。ROW_NUMBER()を知らないが、標準SQLでLIMITなりそう

SELECT * FROM table LIMIT 1999,20 

..上記exmapleで、最初の2000件のレコードが最初にフェッチする必要があり、 を捨てました。通常、結果をフィルタリングする「WHERE」クラスが存在するため、索引を使用してデータ内の正しい場所にジャンプすることはできません。

おそらく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クエリはそれほど顕著と見ることは困難である。しかし、クエリの多くを実行している生産システムでは、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

インデックス列でソートしても、高いオフセットで大きなパフォーマンス上のペナルティがありますか? –

+0

インデックスを使用するクエリの例を追加するように更新されました。 – barryhunter

0

その後、再びスタックオーバーフローは、47Kの結果を紹介のページをすることができます。あなたのデータベースの「日本」に関する話題に820億のリンクがあるとします。誰かが "日本"に質問すればどうなりますか? 822億の結果はすべて実際にクリックされる予定ですか?いいえ、ユーザーは最も関連性の高い上位1000件の結果が必要です。検索が「テスト」のように一般的である場合、関連性を判断する方法はありません。この場合、他のユーザーが一般的な検索の影響を受けないように、YouTube/Googleは返されるボリュームを制限する必要があります。何がより速く、1,000件の結果または82,000,000,000件の結果を返しますか?

+0

はいしかし、あなたじゃありません全体量を返すと、その部分集合が返されます。私の質問は、サイズNのセットで50億レコードから50レコードを返しますが、100レコードから開始した場合よりも大きなパフォーマンス上のペナルティがありますか? –

関連する問題