MySQL, SQL

SQLアンチパターン本購入。

SQLアンチパターン

  • ID リクワイアド(とりあえずID)
    ⇒他のテーブルで共通名でいいから分かりやすい名前を
  • ジェイウォーク
    ⇒交差テーブル
  • キーレスエントリ(外部キー嫌い ※アプリ内で整合性を取ろうとする、アプリ以外からゴミデータが入る場合がある)
    ⇒外部キー制約を宣言する
  • とりあえず削除フラグ
    ⇒状態を持たせる
    NEWや、有効、中止、キャンセル、廃止予定など
    ⇒全てのテーブルに削除フラグはおかしい。
    ⇒削除は設計不足を示す
    お客様は本当に削除と言っているのか。
    ⇒フラグ以外もある。
    更新、削除をしない世界もある
    ⇒よく考えた上での削除フラグならOK
  • ポリモーフィック関連
    ⇒交差テーブル
  • マルチカラムアトリビュート
    ⇒複数の列ではなく、複数の行に。従属テーブルを作る。
  • メタデータトリブル ※年が変わる度にテーブルや列を追加している。
    ⇒パーティションニングと正規化で対応
  • シュードキー・ニートフリーク (擬似キー潔癖症。欠番を埋めてしまう)
    ⇒欠番は埋めない。

時代はBIGINT
http://hamamuratakuo.blog61.fc2.com/blog-entry-648.html

設計時にintとbigintで悩むよね
http://snowland.net/nucleus/item/3014

 

MENTORの原則

  • Measure(測定)
  • EXPLAIN(解析)
  • Nominate(指名)
  • Test(テスト)
  • Optimize(最適化)
  • Rebuild(再構築)

クエリ

  • スパゲッティクエリ・・・1ステップで解決しようとする。
    ⇒UNION等を使い、分割してワンステップずつ解く。
  • インプリシットカラム(暗黙の列) ※*で不必要な列まで取得する。定義変更によりバグの元になる。
    ⇒SELECTはきちんと列を明示的に指定する。

MySQLテーブル設計入門

 

 

考え方の順番

  • 最初に全部入りで考えてみる P22
  • 正規化とか考えずに必要なものを全部テーブルに詰め込んで見る
  • 正規化手順に沿って5NFまで持っていく
  • もちろん慣れていれば3NFくらいからいきなり書き始められる。

NULLでないこと。P48
原則的にNOT NULL制約をつける

 ・テストケースが膨大に増える。
・演算になれていないと分析に時間がかかる。
TRUE and NULL => NULL
FALSE and NULL => FALSE
TRUE or NULL => TRUE
FALSE or NULL => NULL

都市伝説 P89

MySQLを使うなら遅くなるから正規化してはいけない?なぜRDBMSを扱う上で正しい正規化でレスポンスが悪くなるの?

  • 確かにMySQL5.5以前は遅くなるケースもある
  • プライマリーキーを使った結合なら大概ちゃんとした速度で動く。NLJなので数百万件に達すると遅くなる
  • JOINすると遅くなるのは多くの場合ソート、綺麗にインデックスを使いきれていないケース

複合インデックスが思った通りに使えないパターン P117

  • OR演算子
  • IN演算子
  • 不等号演算子
  • ASC, DESCの混在
  • JOINの結合順序

Using Filesort ※クイックソート sort_buffer_size
http://nippondanji.blogspot.jp/2009/03/using-filesort.html

  • Filesortとはクイックソートのことである。
  • JOINにおいてORDER BYが指定されているとき、ソートが行われるタイミングは3種類ある。
  • Using filesortがEXPLAINに出ていないときはインデックスを用いてソートが行われている。(最も高速。)
  • Using filesortだけがEXPLAINの最初の行に出ている時は、先にソートしてからJOINが実行されている。
  • Using temporary; Using filesortがEXPLAINの最初の行に出ている時は、先にJOINしてからソートされている。(最も遅い。)
  • WHERE句による検索条件とORDER BYにおけるソート条件は、一つのテーブルに集中させる。
  • JOINにおいてソート処理する場合には、LIMIT句が適用されるのはJOINとソートが完了した後である。
  • LEFT/RIGHT JOINの場合には、LIMIT句の問題はサブクエリである程度対策が可能である。@see http://nippondanji.blogspot.jp/2009/03/using-filesort.html

⇒インデックスが使われるようにチューニングする。

 

すぐに絶対に読み切らならなければいけない本が6冊溜まってしまっている。消化します。

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)