LoginSignup
45
38

More than 5 years have passed since last update.

Mysqlでinsert、delete、updateが遅い場合の対策

Posted at

insert

遅い原因

insertする際に、対象テーブルのインデックスブロックを読み込んで、
更新かけるので、インデックスサイズが大きいと、パフォーマンスが落ちる。
なので、テーブルのデータ増加が原因で、I/Oが発生し、徐々に遅くなっていく。
インメモリで処理できなくなると、突如としてパフォーマンスに影響が出やすい

対策

  • テーブルサイズをできるだけ小さく(レコード長を小さく)
  • インデックスサイズを小さくすること(無闇にインデックス貼らない)
  • パーティショニング(DB間のテーブル移動)
  • 不要データ削除
    • 16KB毎(たぶん)のブロック単位でデータを保持しているので、 断片化されたデータを削除しても効果が薄いです。 Auto Incrementの場合は、ID1〜10000等をまとめて削除する等であれば、効果が期待できます。 ただし、ただし次のインサート以降、空いたブロックを活用するので積極的にデータ削除。
  • インデックス削除

delete

遅い原因

特定レコードの読み込み、インデックス全削除が必要なのでかなり重い。
つまり、一番遅い。

対策

  • delete前にselectしてメモリに載っける(もちろんindex使う)
  • mysqlのパーティション機能を使う。
    • 例えば、ログ系テーブルの場合、レンジパーティションを使えば、期間毎に、物理テーブルが別れるため、そもそもdelteする必要が無くなる場合が多く、dropでテーブル削除が可能です。

update

遅い原因

selectしてから、テーブルデータの更新、更に
インデックスの更新も行うため

対策

  • インデックスの見直し。 インデックスのサイズが大きいと、サイズに比例して、更新に時間掛かる
45
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
38