目次
sqlでupdate文を高速化するときに見直すべきポイント
レコード数が少ないときは、まったく気になってなかったのですが、
1万件、10万件、、、、と増えてきたときになんか違和感。。。
気づいたら、10万件の中の一部のレコードにupdate文かけるだけでも
10分以上時間がかかっている。
Why!?
it takes too much time !!!!!!
I can’t wait !!!!!!!!!!!
というわけで、すごく悩んだのですが、
その時に、見直したupdate文のポイントをご紹介します!
update文が遅い原因
そもそもなぜupdate文が遅いのかというと、
selectしてから、レコードの更新を行うから。
ということは、
select文を高速化できれば、
update文も高速化するのではないかという観点で
見直してみました。
ポイント①:インデックスの見直し
update文の検索キーになるカラムにインデックスをはる。
レコード数が少ないときは、インデックスは、特に効果は発揮しませんが、
10万件となれば話は別!
検索キーになるカラムにインデックスをはりましょう!
インデックスをはることで、なぜ、高速化につながるかの詳細は、こちらから。
インデックス数が多い、またはデータサイズが大きいカラムにインデックスを
はると遅くなる可能性もあるらしいので、ご注意を。
ポイント②:update文のwhere句の見直し
今回の解決方法は、これでした。
インデックスもちゃんとはってあったし、何でだろうと悩んでいたのですが、
これだけで本当に高速になりました。
where句に、より条件を追加して、検索対象にしないレコードを増やす!!!
これなんです。
考えてみれば、当たり前といえば当たり前なのですが、
意外にもスパっと抜けてました。
具体的には、
1 |
UPDATE table_name SET column1 = '更新します' WHERE record_id = 70101; |
というのがあったとします。
このupdate文は、record_id = 70101 のもののカラムを更新するということなのですが、
このwhere句だけだと10万件のレコードを全てみていって、record_id = 70101 に一致する
カラムを更新することになります。
なので、例えば、レコードの有効、無効を判定するフラグ available_flg なるものが
あったとして、有効なレコードのみが対象だったりすれば、それをwhere句に追加する。
1 |
UPDATE table_name SET column1 = '更新します' WHERE record_id = 70101 AND available_flg = 1; |
こうすることで、update文の実行の際に、検索対象のレコードを絞ることができて、
高速化につながります。
update文で、極力、where句に条件を指定するようにしたことで、
もともと10分以上かかっていたものが、30秒ほどで完了するようになりました。
最後に
ほんとにsqlは、書き方で全然実行時間がかわってきます。
update文、select文は、特に!!!
もし、お悩みの方がいらっしゃったら、
インデックス、where句を見直してみるのがいいかもしれないです(^o^)
デミ
最新記事 by デミ (全て見る)
- 【20分で完了】MacにDocker for Macのインストール - 2017/02/02
- 【2017年版】Web接客ツール9社を比較してみた - 2017/01/26
- 【昼休み中に完了!】Macで最新Ruby、Railsのインストールから画面表示まで - 2017/01/19