Open23

DB

FumiyaNakamuraFumiyaNakamura

このサイトを中心にみていく
https://mickindex.sakura.ne.jp/index.html

FumiyaNakamuraFumiyaNakamura

関係と表の違いは、関係はタプルが重複することを許容しないが、表は許容する

FumiyaNakamuraFumiyaNakamura

文字型や数値型のようなスカラ型は制約があるがとても貧弱。
CHECK制約をつけることで格納可能な値を制限することができる

FumiyaNakamuraFumiyaNakamura

標準SQL規格で、配列型がサポートされるようになった。これは第1正規系に反するため、なるべく使わない方がいい。

第1正規系: 属性が分解不可能。1つのセルには1つのスカラ値

FumiyaNakamuraFumiyaNakamura

わかりみSQL

FumiyaNakamuraFumiyaNakamura

WHEREは行の選択条件
HAVINGはグループの選択条件

GROUP BYで行をグループ化したらHAVINGを使う

FumiyaNakamuraFumiyaNakamura

GROUP BYとHAVINGを使うと、全部周回してから結果を切り捨てているため、一般的には遅い。

WHEREとGROUP BYで集計対象の行を絞ってから集計した方が速い。

FumiyaNakamuraFumiyaNakamura

nullとの計算式はどれもnull。
※ SQLの結果がおかしい場合はnullが含まれてないか疑う

FumiyaNakamuraFumiyaNakamura
FumiyaNakamuraFumiyaNakamura

トランザクションが必要な背景

通常、Webアプリケーションから大量の問い合わせ(SQL文)がくる。
このとき、いくつか考えることが出てくる。

FumiyaNakamuraFumiyaNakamura

1つ目は、同一レコードが同時に更新される場合。
つまり競合状態をどう回避するか

FumiyaNakamuraFumiyaNakamura

次にデータベースの更新途中でシステム障害が起きたら、データベースをどんな状態に復旧したら良いか。正しい状態とはそもそも何か?

FumiyaNakamuraFumiyaNakamura

トランザクションとは、アプリケーションがデータベースに対する複数の読み書きを論理的な単位としてまとめる方法

FumiyaNakamuraFumiyaNakamura

トランザクションが持つ特性

  • 原子性 (Atomicity): トランザクションに含まれる操作全てが成功か中断になる
  • 一貫性 (Consistency): トランザクションを実行した前後ではデータの一貫性が損なわれない
  • 分離性 (Isolation): 同時実行している複数のトランザクションは互いに独立している
  • 永続性 (Durability): 一旦コミットが完了したトランザクションによる変更は永続化される
FumiyaNakamuraFumiyaNakamura

分離性を実現するために単純に逐次処理をするという方法も考えられるが、現実的には性能を考慮する必要があり、もう少し違うアプローチが取られている。
実際の実現方法は、どういう並行性の問題を許すか、あるいはトランザクション間でどの程度の影響を許すか(トランザクションの独立性)によって異なる

FumiyaNakamuraFumiyaNakamura

MySQLの分離レベル
MySQL5.6 (InnoDB)でサポートされている分離レベルは

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ (デフォルト)
  • SERIALIZABLE

実装にはMVCCやロックが使われる
分離レベルが高くなればなるほど多くの並行性の問題を抑止することはできる。しかしその分処理速度は落ちる