2

Twitter ユーザーをトラバースし、ツイートの言語を分析し、適切な言語が見つかった場合は、すべての友人とフォロワーがキューに追加されるスクリプトを作成しています。これらのユーザーは順番にキューから選択され、プロセスが何度も実行されます。データベースを高速に保つために、ユーザーがキューで持つことができるすべての異なる状態に同じテーブルを使用しています (「言語を分析する」= 1、「取得する」= 2、「進行中」= 9、 「完了」= 99 および「ブロック」= -1)。そうすれば、その人がテーブルに既に存在するかどうかを確認することなく、すべての友人/フォロワーをテーブルに追加できます (もちろん、各 Twitter ユーザーは一度だけ分析する必要があります)。

INSERT IGNORE INTO queue (tid,queuetype) VALUES (1,1),(2,1) ... (xxx,1);

これは非常に高速です。しかし、テーブルが大きくなるにつれて (数百万行)、キューから次のユーザーを選択するのはますます遅くなります。

今、私はこのようにしています ($uniqueid は実際にはプロセス番号です):

UPDATE queue SET k='$uniqueid', queuetype = '9' WHERE k='0' AND queuetype = '1' LIMIT 1

に続く:

SELECT tid FROM queue WHERE k='$uniqueid' LIMIT 1

次に、すべての魔法を実行し、最後にキュータイプを新しいキュータイプ (完了、ブロックなど) に変更します。

ソリューションをさらに最適化できますか? 「SELECT tid」は非常に遅く、実行に数秒かかります。k にインデックスを追加すると、選択は高速になりますが、更新は非常に遅くなり、結果はさらに悪くなります。

このタイプのキューをさらに最適化するにはどうすればよいですか? 別のデザインを検討する必要がありますか?別のデータベース?すべてのソリューションは大歓迎です:)

[編集]

エンジンはマイサム

EXPLAIN キュー

 tid    int(11) NO  PRI     
 queuetype  tinyint(1)  NO          
 k  mediumint(6) unsigned   NO          
4

1 に答える 1

0

高速INSERTなパフォーマンスが必要で、完全一致のみを検索したい場合は、ハッシュされたインデックスが必要になることをお勧めします。しかし、こちらのドキュメントを熟読すると、ハッシュ化されたインデックスは NDB ストレージ エンジンでのみ使用できることがわかりました。

私はそのストレージエンジンについて何も知らないので、それをお勧めするのを躊躇しますが、それほど不便でなければ試してみる価値があるかもしれません.

こちらもご覧ください

于 2012-04-04T12:32:03.437 に答える