1

最近、特に InnoDB (MyISAM から) を使用するようにテーブルを切り替えたので、クエリを実行しながらデータベースを更新する機能を利用できSELECTます (つまり、それぞれのテーブル全体をロックしないことによりINSERT) 。

毎週実行されるサイクルがあり、INSERTS約1億行を使用しています"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."

1 秒あたり約 2000 回の挿入/更新という現在の更新パフォーマンスにはかなり満足しています。

ただし、このプロセスの実行中に、通常のクエリに非常に時間がかかることがわかりました。

たとえば、これは実行に約 5 分かかりました。

SELECT itemid FROM items WHERE itemid = 950768

( INSERTs が発生していない場合、上記のクエリは数ミリ秒かかります。)

SELECTクエリの優先度を高くする方法はありますか? それ以外の場合、パフォーマンスを向上させるために MySQL 構成で変更できるパラメーターはありますか?

トラフィックが少ないときにこれらの更新を実行するのが理想的ですが、 SELECT クエリごとに数秒以上かかると、更新とデータベースからの読み取りを同時に実行できるという目的が損なわれるように思われます。私は何か提案を探しています。

Amazon の RDS を MySQL サーバーとして使用しています。

ありがとう!

4

1 に答える 1

2

ほぼ1年後にこれをすでに解決していると思います:)しかし、私は参加すると思いました。内部ロックに関するMySQLのドキュメントによると(明示的なユーザー開始のロックとは対照的に):

テーブルの更新は、テーブルの取得よりも優先されます。したがって、ロックが解放されると、そのロックは書き込みロック キュー内の要求に対して使用可能になり、次に読み取りロック キュー内の要求に対して使用可能になります。これにより、テーブルに対して大量の SELECT アクティビティが発生した場合でも、テーブルへの更新が「枯渇」することがなくなります。ただし、テーブルの更新が多数ある場合、SELECT ステートメントは更新がなくなるまで待機します。

SELECTそのため、挿入/更新が完了するまで (または少なくとも一時停止するまで) キューに入れられているようです。その優先度の変更に関する情報は、MySQL のテーブル ロックの問題ページにあります。

于 2014-04-17T23:33:18.787 に答える