sqlでupdate文を10倍高速にしたいときは、ここを見直せ!

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句に、より条件を追加して、検索対象にしないレコードを増やす!!!

これなんです。
考えてみれば、当たり前といえば当たり前なのですが、
意外にもスパっと抜けてました。

具体的には、

というのがあったとします。
このupdate文は、record_id = 70101 のもののカラムを更新するということなのですが、
このwhere句だけだと10万件のレコードを全てみていって、record_id = 70101 に一致する
カラムを更新することになります。

なので、例えば、レコードの有効、無効を判定するフラグ available_flg なるものが
あったとして、有効なレコードのみが対象だったりすれば、それをwhere句に追加する。

こうすることで、update文の実行の際に、検索対象のレコードを絞ることができて、
高速化につながります。

update文で、極力、where句に条件を指定するようにしたことで、
もともと10分以上かかっていたものが、30秒ほどで完了するようになりました。

最後に

ほんとにsqlは、書き方で全然実行時間がかわってきます。
update文、select文は、特に!!!

もし、お悩みの方がいらっしゃったら、
インデックス、where句を見直してみるのがいいかもしれないです(^o^)

関連記事

コメントは利用できません。

ピックアップ記事

  1. 2013/10/30

    風邪対策
  2. 2014/6/11

    2014in summer

ピックアップ記事

  1. 2016-11-16

    これから必ず来るのはこの女優3選!!!

    出典:http://www.incent.jp/incent/talent/iriyama/&nbs…

ピックアップ記事

  1. 2016-8-11

    jqueryでtableを整形する便利プラグインDataTables!

    jqueryとDataTablesでお手軽table操作Webページで動的なデータの表を作ることって…

ピックアップ記事

  1. 2016-6-28

    【売れっ子への道渋滞中】若手芸人高齢化について考える。其の一

    若手といえば何才くらい?テレビで体を張って笑いを取る若手芸人たち。「若手」という言葉を聞けば、誰もが…
ページ上部へ戻る
Top