1

ユーザーに関するステータス情報を 1 分ごとに保存する mysql テーブルがありますが、挿入が完了するまでに最大 30 秒かかり始めました。まだ数十人のユーザーしかいないプライベート ベータ版ですが、数千を処理できます。

使用情報:

  • 挿入: ユーザーごとに 1 分に 1 回、新しい行が挿入されます。
  • 更新: ユーザーごとに、数分ごとに最後の数行が改訂されたデータで更新されます
  • 削除: 6 か月以上前のエントリは 1 日 1 回削除されます
  • 選択: ユーザーごとに 1 日に約 10 の選択のみ (ユーザーごとにその日のすべての行を選択するものもあれば、ユーザーの最新の行のみを取得するものもあります)。
  • 何かに影響する場合は、AWS RDS を使用しています (Mysql 5.5.27)

これは私が継承したテーブル定義です:

CREATE TABLE statusMonitor (
  personId          int(10) unsigned  NOT NULL,
  monitorDateTime   datetime          NOT NULL,
/*
Other columns
*/
  UNIQUE KEY UQIX_statusMonitor (personId,monitorDateTime) USING BTREE,
  KEY personId (personId,monitorDateTime/* other cols */)
) ENGINE = MyISAM;

3 つの変更を考えていますが、これらは正しい方向に進んでいますか?

  1. InnoDBは、書き込み頻度の高いテーブルには MyISAM よりも適しています。
  2. 最初に日付に基づいてインデックスを作成する方が効率的であると考えています
  3. キーはデータをクラスター化してルックアップを高速化し、挿入は物理的に近くなります。

したがって、これが私の新しい定義になります。

CREATE TABLE statusMonitor (
  personId          int(10) unsigned  NOT NULL,
  monitorDateTime   datetime          NOT NULL,
/*
Other columns
*/
  PRIMARY KEY (
      monitorDateTime,
      personId
  ),
  UQIX_statusMonitor (monitorDateTime,personId) USING BTREE,
  KEY personId (monitorDateTime,personId/* other cols */)
) ENGINE = InnoDB;

ユーザーがかなり少ないため、テーブル定義を変更することでしばらく問題を解決する余裕がありますが、最初から正しく設定したいので、それは 1 回だけです。

4

1 に答える 1

1

InnoDBMyISAMの場合はテーブル全体をロックし、 の場合は行のみをロックするため、挿入が多い場合に適していますInnoDB。垂直方向および/または水平方向のパーティションも検討できます。KEY に注意してください。キーが多すぎると、リクエストが遅くなる可能性があります。

于 2013-11-04T10:07:51.710 に答える