skillup

技術ブログ

Database

SQLのチューニングに関して

投稿日:2016年12月5日 更新日:

ここ2か月ぐらいはSQLの本でがりがり勉強してきましたね。当然復習も必要かと思いますが、だいぶいろんなことを覚えたなあという気がします。

一番勉強になった本はもちろん「達人に学ぶ SQL徹底指南書」とこのサイト「http://mickindex.sakura.ne.jp/database/db_support_sinan.html」です。

かなり高度なことを書いていると思いますが、平易な例題やなんといってもサイトに練習用のSQLがしっかり乗っているため非常に勉強しやすいです。

内容的にはおそらく3割ぐらいしかやっていないでしょう。まだまだ入り口に立ったばかりかと思いますが、これをベースにいろいろなSQLを書いていきたいと思います。

ちょっとほかにも勉強しないといけないこともあるので一旦SQLはおいておこうと思います。

さて、最後の本日はSQLのチューニングについてです。

こちら箇条書きにていろいろ書いてみたいと思います。

サブクエリを引数にとる場合INよりもEXISTSをとる。INよりも結合をとる

  • 結合キーにインデックスが張られていれば、テーブルの実表は見に行かず、インデックスを参照するのみで済む
  • EXISTSは一行でも条件に合致する行を見つけたらそこで検索をうちきるので、INのように全表検索の必要がない。NOT EXISTSも同様

ソートの回避

  • ALLオプションをうまく使う
  • DISTINCTをEXISTSで代用
  • MAX/MINでインデックスを使う
  • WHERE句で書けるものはHAVINGに書かない
  • GROUP BY ORDER BYでインデックスを使う

インデックスが有効活用されないとき

  • 索引列に加工を行う(計算式など)
  • IS NULLを使用
  • 否定形の使用
  • ORの使用
  • 後方一致、中間一致のLIKE述語
  • 暗黙の型変換

中間テーブルを減らせ

  • HAVING句の活用
  • IN述語で複数キーを利用する場合は一か所で
  • 集合よりも結合を先に
  • ビューを使いすぎない

 

-Database
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

CASE+HAVING句

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。 まず下記のようなテーブル(testresults)があるとします。 student | class | sex | sco …

no image

Webの高速化に関して

Webの高速化に関してメモ。 高速化って言っても幅広いんですけどね。自分が行なっている対策に関して。 一応LAMP環境を前提にしてます。 Contents1 一番大事なのは測定2 DB対策3 フロント …

no image

MYSQL group_concat,cast等

実務でいろいろとトラブルがあり、データベースから在庫データを見てくれ~なんて依頼がありましたんでSQLをごりごり書いていたんですが、普段使わないようなSQLの構文を使ったのでここでちょっと紹介します。 …

no image

HAVING句の活用 発展編

今回からはまたまたHAVING句です。 下記のようなテーブル(teams)があり、全員が待機状態のチーム(全員がそろっている)を求めます。 member | team_id | status &#82 …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …

アーカイブ