AWS に MySQL m2.2xlarge インスタンスがあります。MySQL データ ディレクトリは、ルート EBS / にあります。RAID ではなく単一の EBS です。3つのメインテーブルがあります。そのうちの 1 つはTable C
コンテンツが最大で、過去 1 日分のデータのみが使用されます。これらのテーブルの挿入レートは、1 日あたり約 80.000 行です。3 つのテーブルには、約 4,200 万行あります。innodb_buffer_pool_size には、約 30 GB のインスタンス RAM があります。
Table A
が最も重要で、そのデータ長は ~33GB でインデックスは ~11GB で、
Table B
データ長は ~8GB でインデックスは ~5GB です。
私たちのウェブサイトでは、2 つの主要なクエリ (レイテンシに関して) は次のようになります。
SELECT * FROM TableA WHERE id in (.....)
SELECT * FROM TableB JOIN .... WHERE id in (.....)
ほとんどのページでは、(...) は最近の 50 個までの ID であり、これらのクエリはそれぞれ 50 ミリ秒未満かかります。しかし、他のいくつかのページでは古い ID にヒットし、これらのクエリのレイテンシは 500 ミリ秒、800 ミリ秒、最大 1.5 秒に急上昇しました。
Mysql の再起動後、SELECT id FROM TableB
インデックスをキャッシュ/メモリに強制するテストを行いました。クエリはTable B
まだ遅くなります。それから私はしましたSELECT * FROM TableB
。そして今、テーブル全体がキャッシュ/メモリ内にあるため、クエリは非常に高速になります (<50ms)。
私の質問: > 500 ミリ秒、> 1000 ミリ秒は、PRIMARY KEY によって行を取得するだけのクエリの妥当な待機時間ですか? 42M テーブルでも?すべての行がディスクにある場合でも? 私には多すぎるようです。
MySQL データを一時ストレージ (/mnt) に移動すると、これは改善されますか? プロビジョンド IOPS の使用は役に立ちますか?