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