初心者のためのSQLチューニング

このエントリーをはてなブックマークに追加
投稿者:chikunai 投稿日時:2010-06-06(日) 17:08

昨今は、システム構築にデータベースは欠かせない存在です。データベース RDBMSが使われない事案が無いほど普及しています。そんな中、期待したパフォーマンスが出ない原因、ボトルネックに、データベースに問題があることが多いです。

なぜプログラマーはデータベースに歩み寄れないのか?

スケールアウトしにくいRDBMSにおいて、単なるデータの入れ物のような扱いしかしないプログラマーは、RDBMSの負荷を高めるばかりです。SQLはできるけど、、、データベースには疎いプログラマー、開発に向けて、簡単なチェックリストを作ってみました。

SQL毎の実行時間を調べ、遅いSQLについては以下を確認します。

  • テーブル結合している列に、索引はついているか? ついていない場合は索引を作成する。
  • 条件式(WHERE句)に使っている列に、索引はついているか? ついていない場合は索引を作成する。
  • 並び替え(ORDER BY句)に使っている列に、索引はついているか? ついていない場合は索引を作成する。
  • 条件式(WHERE句)に使っている列に、関数や計算式を使っていないか? 使っている場合は使わない回避策を考える。
  • ただし、テーブルに索引をつけすぎていないか? 多いとINSERT、UPDATEのパフォーマンスが悪化します。
  • ただし、索引をつけるその列のカーディナリティは高いか? 例えば性別など、0(男)と1(女)しか入っていない列に索引をつけても効果はありません。カーディナリティが低すぎます。

それでも効果が期待できない、効果が無いときは、仕様にまで踏み込みます。私はこれが一番好ましいと考えます。

  • テーブル結合する前(FROMの中のSELECT文などに)に、期間が絞れないか?
  • テーブル結合する前(FROMの中のSELECT文などに)に、件数が絞れないか? MySQLならLIMITで。DB2ならFETCH FIRST 10 ROWS ONLY。
  • 索引がついている列を使って、新に別の条件がつけられないか?

ぜひ、試してみてください。

そうだ、一つ忘れていたので追記。

Prepared Statementを使おう。使うと、データベースはコンパイルしたSQLをキャッシュしてくれます。Prepared Statementを使うと、私の知っているDBMSはキャッシュのヒット率があがります。コンパイル時間が減らせるのでCPU使用率も少し下げられます。さらにSQLインジェクション対策にもなります。

ここで挙げたものは非常に初歩的なものです。

もっと、より詳細にチューニングしたいときは、ミックさんのホームページを読んでてみてください。

SQLを速くするぞ
http://www.geocities.jp/mickindex/database/db_optimize.html

勉強するなら、ミックさんの書籍「達人に学ぶ-SQL徹底指南書」がオススメです。




コメント(0)

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <table> <tr> <th> <td>
  • 行と段落は自動的に折り返されます。
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • 次のタグを使用してソースコード構文をハイライトすることができます。: <code>, <blockcode> The supported tag styles are: <foo>, [foo].
  • You may insert videos with [video:URL]
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。

書式オプションに関するより詳しい情報...

CAPTCHA
この問題はユーザが人間であるかどうかをテストし、スパムによる自動投稿を防ぐためのものです。
Image CAPTCHA
Enter the characters shown in the image.
Drupal theme by Kiwi Themes.