7

mysql テーブルにデータを挿入するときにパフォーマンスの問題が発生しています。テーブルには多数の列があります。DATE、A、B、C、D、E、F としましょう。ここで、DATE、A、B、C、D、E は主キーです。毎日、そのテーブルに (異なる日付で) 70,000 行を挿入すると、このテーブルには現在 1,800 万行が含まれています。行を挿入するために使用する方法は、70k の INSERT クエリを送信するだけです。

私が抱えている問題は、クエリに以前よりも多くの時間がかかり始めたことです。数分から数時間かかります。インサートのプロファイリングを行った結果、得られたチャートは次のとおりです。

各挿入の速度 (秒) とその日の挿入数: 各挿入の速度 (秒) とその日の挿入数

いくつかの奇妙な事実:

  1. ほとんどのクエリは実行に 2 ミリ秒未満かかります
  2. 遅いクエリの速度は、その日付のテーブル内の行数に比例して増加します
  3. この動作は、データベースで一連のプロセスが発生した後、夜間にのみ発生します。日中の挿入は高速で、週末も高速です
  4. 全体的な速度は、データベースで他に何が実行されているかに依存しません。実際、これが発生した場合、データベースで他に何も実行されていません。
  5. クエリが高速かどうかを説明できるクエリは何もありません。高速なものは低速のものと非常に似ており、ある日から別の日に同じセットではありません。
  6. 振る舞いは、ある日から次の日に変わることはありません。

何が原因でしょうか?

** 編集 ** インデックス内の列は次の順序になっています。

DATE NOT NULL,
DATE NOT NULL,
VARCHAR (10) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (3) NOT NULL,
VARCHAR (45) NOT NULL,
DOUBLE NOT NULL,
VARCHAR (10) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,

日付は今日と同じか空のままで、double は常に同じ数値です (誰がこのテーブルを設計したかはわかりません)。

4

1 に答える 1

3

簡単に説明すると、1 日の範囲内で非増分のインデックスがあるということです。非増分インデックスは、増分インデックスよりも頻繁にインデックス ツリーの再調整が必要になるため、一般に挿入/更新に時間がかかります。

これをさらに説明するには、次のスキーマを想定します。

a (int) | b (varchar)

そしてインデックスは(a, b)

次に挿入します。

1, 'foo'
2, 'bar'
3, 'baz'

挿入ごとにインデックスが追加されるため、これは非常に高速です。次に、次のことを試してみましょう。

100, 'foo'
100, 'bar'
100, 'baz'

これは、'bar' を 'foo' の前に挿入する必要があり、'baz' を他の 2 の間に挿入する必要があるため、それほど高速ではありません。行為には時間がかかります。リバランスに関係するコンポーネント (この場合は a=100 のサブセット) が大きいほど、時間がかかります。このリバランス アクティビティは、より頻繁かつ広範囲に発生するだけであり、必ずしも挿入ごとに発生するわけではないことに注意してください。これは、通常、ツリーが拡張のために葉の中にある程度のスペースを残すためです。リーフがスペースを使い果たすと、リバランスの時期であることがわかります。

あなたの場合、インデックスは主に現在の日付に基づいているため、1 日の範囲内で常にツリーのバランスを取り直しています。毎日新しいスコープが開始され、その日のスコープ内でリバランスが開始されます。最初は、これにはほんの少しのリバランスが含まれますが、その日の既存のエントリの範囲が広がるにつれて、これは大きくなります。新しい一日が始まると、このサイクルが最初からやり直されます。これが、目にしている結果です。

これが主キーで発生していると、問題がさらに悪化する可能性があります。新しいエントリに対応するために、一部のインデックス ポインターをシフトする代わりに、データの行全体をシフトする必要がある場合があるからです。(この最後のポイントは、MyISAM クラスタリングが主キーで実行されることを前提としています。この点については、今日まで明確にされていませんが、事例証拠はこれをサポートしているようです。たとえば、ここここを参照してください。)

于 2013-09-17T20:12:32.540 に答える