(下手な英語を許してください)
特定の範囲の URL でカスタム Web クローラーを操作しています。私はそれをテストしており、これまでのところすべてが完璧に機能しています..
最近、議論したいパフォーマンスの問題に気づきました。ボットは、url_pool テーブルでインデックス付けされたページをクロールしています。ターゲット ページでターゲット コンテンツを検索している間、ボットは、テーブルにない場合は見つけたページ リンクを保存します。すでに...いくつかのクロールスクリプトを(同時に)操作しているときに競合の問題が発生しましたが、修正しました。
約 150 万ページをクロールした後、私の url_pool テーブルには、URL、いくつかの「フラグ」、URL ハッシュ (32 桁の simhash)、ドメインなどを含むほぼ 500 万行が含まれています...
mysql db テーブルは、大きなバッファを備えた innodb であり、検索クエリに従って適切にインデックス化されています。ボットのパフォーマンスを監視しているときに、テーブル内の URL の重複を防ぐために使用する「存在するかどうかを確認する」機能がますます遅くなっていることに気付きました。テーブルが大きくなるほど検索に時間がかかることは明らかですが、実行時間の増加を確認するには時期尚早のようです。
パフォーマンスを要約すると:
- url_pool~100K ROWS -> クロール プロセス全体で 0.8 秒 (1 ページ)。
- url_pool~800K 行 -> 1.1 秒
- url_pool~1.8M 行 -> 1.9 秒
- url_pool~3.5M 行 -> 3.2 秒
- url_pool~5M 行 -> 4.8 秒
もう1つの重要な事実は、テキストを使用して検索するのではなく、テーブルにURLが存在するかどうかを確認しながら、ハッシュを作成し、それをテーブル内の他のものと照合していることです。クローラーを構築する初期段階で受け取ったアドバイスに従いました、パフォーマンスが向上することがわかりました。
現在、各ページの 1.9 秒は運賃ですが (4 つのボットを一緒に実行することを考えると)、5 秒では遅すぎます....
アドバイスをお願いできますか?
編集:
いくつかの詳細情報:
私は使用します:
SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
インデックス付きの列に対する検索クエリ(ドキュメントでは、結果を高速化するために推奨されています)の場合、テーブル構造は非常に単純なテーブルです
ID
リンク (varchar 400)
link_simhash (varchar 32)
ドメイン (varchar 200)
フラグ 1 (ブール値)
フラグ 2 (ボール)
bot_visit (int)
date_found (日付)
date_crawled (日付)
私が言ったように、場所はリンクハッシュを参照しています。
何か案は???誰でもない???私の質問の何が問題なのですか?