insert
遅い原因
insertする際に、対象テーブルのインデックスブロックを読み込んで、
更新かけるので、インデックスサイズが大きいと、パフォーマンスが落ちる。
なので、テーブルのデータ増加が原因で、I/Oが発生し、徐々に遅くなっていく。
インメモリで処理できなくなると、突如としてパフォーマンスに影響が出やすい
対策
- テーブルサイズをできるだけ小さく(レコード長を小さく)
- インデックスサイズを小さくすること(無闇にインデックス貼らない)
- パーティショニング(DB間のテーブル移動)
- 不要データ削除
- 16KB毎(たぶん)のブロック単位でデータを保持しているので、
断片化されたデータを削除しても効果が薄いです。
Auto Incrementの場合は、ID1〜10000等をまとめて削除する等であれば、効果が期待できます。
ただし、ただし次のインサート以降、空いたブロックを活用するので積極的にデータ削除。 - インデックス削除
delete
遅い原因
特定レコードの読み込み、インデックス全削除が必要なのでかなり重い。
つまり、一番遅い。
対策
- delete前にselectしてメモリに載っける(もちろんindex使う)
- mysqlのパーティション機能を使う。
- 例えば、ログ系テーブルの場合、レンジパーティションを使えば、期間毎に、物理テーブルが別れるため、そもそもdelteする必要が無くなる場合が多く、dropでテーブル削除が可能です。
update
遅い原因
selectしてから、テーブルデータの更新、更に
インデックスの更新も行うため
対策
- インデックスの見直し。
インデックスのサイズが大きいと、サイズに比例して、更新に時間掛かる