skillup

技術ブログ

Database

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

投稿日:

本日はSQLコーディングに関して。

ここら辺は実際にプログラムを書く際に重要になってくるネタ。

バインド変数

SQLでプリペアードステートメントを書くのではなく、生のSQLをそのまま書いてしまう手法。

デメリット

  • 実行計画をSQLを書くたびに作成することになるので、負荷が高くなり、性能が落ちる
  • SQLインジェクション

対策

  • バインドするようにプログラムを書き換える
  • 特に発行頻度が高い(ループ内部など)と思われるところを優先的に書きなおす
  • 例外的なケースとしてはフラグ系のところはそれほど影響がない(決め打ちのデータならば処理量は増えないため)

直積により組み合わせが爆発する

SQLの自己結合や外部結合は基本的にはレコードをすべて掛け算するような作りになっている。そのため、結合条件を忘れ、組み合わせが増えすぎてしまうこともある。

結合はループをしていると考える。

デメリット

  •  データ量が増えるにつれ、負荷が高くなり、影響度が多くなる
  • 特定のSQL(組み合わせが多すぎる)のみCPU負荷が大きくなる

対策

  • 結合条件の見直し(結合は基本的にはループと同列に考える。そのためまずはカーディナリティが大きいものから結合したほうが早くなる)
  • 実行計画要チェック

データ量の爆発(インデックスが不適切)

インデックスが不適切に張られていた場合、フルスキャンを行わなくてはならなくなり、スピードが落ちる。特にデータ量が増えたときに影響が顕著。実行計画への理解も必要

デメリット

  • サービスを開始してしばらくしてから特に影響が大きくなる
  • CPU使用率が100%になっている
  • 単純に遅い

対策

  • 性能テストを早い段階でしておく(大量データでのテストが必要)
  • 実行計画を確認し、SQLが適切かどうかの確認を行う

インデックスの貼りすぎ

インデックスを張りすぎると、更新系の作業で非常に時間がかかることになる

デメリット

  • 検索は早いが、データ更新作業で時間がかかることになる

対策

  • インデックス数に関する制限数を行う
  • 正規化されていない列数が多い
  • 大量更新系のテストをしていない
  • 検索が中心になるテーブルの場合は、インデックスを張ることを優先してOKにする

-Database
-

執筆者:


comment

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

関連記事

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

MySQLでの日付関数

MySQLでSUMやCOUNTなんかはよく使うと思うのですが、日付の関数なんかもかなり使います。 今回は、日付の日数をとりたいときの関数を紹介。 例えばあるカラムにある日付が入力されており、現在との日 …

no image

cakePHPでのマイグレーション

開発を続けているとデータベースのカラムの構造が変更するってことはしょっちゅうですが、管理がいい加減だとメンバー間でテーブルの構造が変わっていたり、本番と開発で違ってくるなどのトラブルが続出します。 そ …

no image

正規化のデメリット

Contents1 正規化のデメリット2 本日のSQL 正規化のデメリット 正規化についていろいろ書いてきましたが、メリットもあればデメリットもあります。 メリットとしては データの不整合が起きにくい …

no image

HAVING句について

本日はHAVINGについて。 かろうじて用法はしっており、たまに使うこともありますが、あまりしっかり理解しているとはいえない状況ですので、掘り下げてみようと思います。 WHEREとは違い、抽出した結果 …