2012-04-04 6 views
2

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   
+0

おそらくインデックスを少し拡大できますか?どのようなタイプですか?どのストレージエンジンを使用していますか? EXPLAIN PLANを試してみるとどうなりますか?そんなこと。 –

+0

編集されたメッセージ。ありがとう! –

答えて

0

キューをEXPLAINであります一致する場合は、ハッシュされたインデックスが必要です。しかし、ドキュメントhereを熟読すると、ハッシュされたインデックスはNDBストレージエンジンでのみ利用可能であることがわかります。

私はそのストレージエンジンについて何も知らないので、それを推奨することを躊躇しますが、あまりにも不便でないなら試してみる価値があります。

hereも参照してください。

+0

興味深い、それを探します!しかし、実際にはINSERTではなくSELECTが遅いです。 INSERTはかなり高速です... –