twitterusersをトラバースし、そのツイートの言語を分析し、適切な言語が見つかると、すべての友人とフォロワーがキューに追加されます。これらのユーザーは順番にキューから選択され、プロセスは何度も繰り返されます。 dbを高速に保つために、ユーザーがキュー内に持つことができるすべての異なる状態(「解析する言語」= 1、「フェッチする」= 2、「進行中」= 9など) "done" = 99、 "blocked" = -1)。そうすれば、テーブルに誰かが既に存在しているかどうかをチェックすることなく、すべての友人/フォロワーをテーブルに追加することができます(各ツイートユーザーはもちろん1回のみ分析する必要があります)。mysqlのキューを最適化する
INSERT IGNORE INTO queue (tid,queuetype) VALUES (1,1),(2,1) ... (xxx,1);
これは非常に高速です。しかし、テーブルが増えて(数百万行)、キューから次のユーザーを選択すると、それは遅くなり、遅くなります。
今、私はそれをこのように($の一意IDは、実際にはプロセス番号)を実行します。
続いUPDATE queue SET k='$uniqueid', queuetype = '9' WHERE k='0' AND queuetype = '1' LIMIT 1
:
SELECT tid FROM queue WHERE k='$uniqueid' LIMIT 1
を私は、すべての魔法を行い、最後に変更しますqueuetypeを新しいqueuetypeに変更しました(完了、ブロックなど)。
解決策をさらに最適化できますか? 「SELECT tid」は非常に遅く、実行には数秒かかります。 kにインデックスを追加すると、選択は速くなりますが、更新は非常に遅くなり、結果は悪化します。
このタイプのキューをさらに最適化する方法を教えてください。私は別のデザインを考慮する必要がありますか?別のデータベースですか?すべてのソリューションは、大歓迎:)
[EDIT]
エンジンはMyISAMの
私はあなたが速いINSERT
パフォーマンスをしたいだけ正確に検索したい場合は、ことを示唆している
tid int(11) NO PRI
queuetype tinyint(1) NO
k mediumint(6) unsigned NO
おそらくインデックスを少し拡大できますか?どのようなタイプですか?どのストレージエンジンを使用していますか? EXPLAIN PLANを試してみるとどうなりますか?そんなこと。 –
編集されたメッセージ。ありがとう! –