2011-03-11 12 views
1

スケーラブルなMySQLスキーマを書く方法について私はできる限り多くのことを読んできましたが、これが良い考えかどうかはまだ分かりません。MySQLアップデートステートメントが高価ですか?

私はこのプロジェクトをRDSでEC2にホストしています。

私のデータベースでは、私は推測すると約70%の書き込みと30%の読み込みより多くの書き込みになるコアテーブルを持っています。

ただし、テーブルに新しい行を作成すると、5秒ごとに更新を追加する必要があります。全体として、複数の行が毎秒追加/更新されるので、を意味し、UPDATE文は1秒ごとに実行されます。

私が読んできたことに基づいて、MySQLにはテーブルに書き込むときに起こるテーブルロックと呼ばれるものがあります。このテーブルもかなり読み込まれているので、行にUPDATE文を使用するにはあまりにも多くのオーバーヘッド/ロックが発生しますか?

(私の知る限りでは)私のオプションは次のとおりです。頻繁に大きなテーブルの上に

  1. 実行(Do)UPDATE文(毎秒または多分それ以上)
  2. 私は行を作成するステージング表を持っていますそれらを更新し、準備ができたら(行がファイナライズされるまで約20分)、行をステージングテーブルからメインテーブルに発送します。

私はそれは、彼らがコンテンツを見ることができる前に、私のユーザーは約20分待ってますので、ステージング表を避けたいが、それは必要悪だかない場合、私は思ったんだけど。

他のアイデアはありますか?提案?

ありがとうございました!

答えて

2

テーブルロックを適用するかどうかは、ストレージエンジンによって異なります。 MyISAMはテーブルロックを行い、InnoDBは行ロックを行います。

あなたは書き込み行を読みたいと、あなたはInnoDBはそれが(作家が読者をブロックしない、読者は作家をブロックしない)の各行への同時アクセスを許可しますで使用する必要があります

の場合あなたは主キーに基づいて行をudpate、彼らはかなり高速でなければなりません(あなたのサーバーがこれによって生成されるbeeingに追いつくことができる場合)。

+0

私は確かに主キーに基づいて行を更新しています。私はストレージエンジンをまだ決めていませんでしたが、InnoDBはほとんどの場合非常に高速ではないと聞いてきました。しかし、私のケースでは、InnoDBがより良い解決策であると指摘しているので、テーブル全体、つまり特定の行だけをロックしたくないためです。 – user599146

+0

@userほとんどのアプリケーションは、書き込みがほとんどなくても90-95%読んでいます。そのため、MyISAMはやや速いと見なされます。 InnoDBは、データの矛盾がないことを保証するために、より良いデータ整合性を備えています(特にMyISAMはトランザクションをサポートしていません)。この場合、MyISAMのテーブルロックは、読み込みの低い書き込みシナリオを想定しているため、ほとんど確実に遅くなります。 – Davy8

+0

それはたくさんの意味があります。あなたの洞察に感謝します! – user599146

0

Updateステートメントが高価であるかどうかにかかわらず、とにかくそれを行う必要があるように見えます。テーブルを更新しないという選択肢があれば、それはより効果的なものになるはずですが、そうではないと思います。

あなたが求めているような真の質問は、パフォーマンスよりも並行性があるようです。具体的には、小規模な更新が多数ある場合の並行性が向上するか、変更の合計数が同じであるバッチ更新が少なくなるかを問われているようです。

私の経験では、並行処理のためにバッチ処理するのではなく、たくさんの小さな更新を行うほうがはるかに優れています。ただし、バッチ処理を行うと、一般的にパフォーマンスが向上します(更新の場合)。

もう1つのことは、複数のタイプのロックがあることです。更新と選択のためのテーブルのロックは同じではなく、ステートメントが行、ページ、またはテーブル全体をロックするかどうかも考慮する必要があります。通常、ロックはかなりローカライズされていますが、このタイプのアプリケーションでは、ロック戦略の具体的な内容と、特定のニーズに合わせて操作する方法をお読みください。

+0

Hmm。だから、InnoDBテーブルの更新を頻繁に行うのはいいですか?限り、それはうまくいくはずのSELECTを保持しない限り – user599146

+1

このような一般的な声明を作ることは非常に難しいです。ほとんどの場合、アプリが実行される可能性が高い状況下でテストする必要があります。私のアドバイスの主なポイントは、あなたが使用しているDBエンジンのためにLockingを読むことです。あなたが間違っていると、それは難しい問題であり、大きな影響を与える可能性があります。 – JohnFx

関連する問題