DB

このサイトを中心にみていく

基礎理論


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

関係の組は上から下、左から右に順序はないが、表には順序がある

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

標準SQL規格で、配列型がサポートされるようになった。これは第1正規系に反するため、なるべく使わない方がいい。
第1正規系: 属性が分解不可能。1つのセルには1つのスカラ値


パフォーマンス・チューニング

わかりみSQL

WHEREは行の選択条件
HAVINGはグループの選択条件
GROUP BYで行をグループ化したらHAVINGを使う

GROUP BYとHAVINGを使うと、全部周回してから結果を切り捨てているため、一般的には遅い。
WHEREとGROUP BYで集計対象の行を絞ってから集計した方が速い。

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


cross join は m×n
full outer join は m+n

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

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

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

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

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

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

MySQLの分離レベル
MySQL5.6 (InnoDB)でサポートされている分離レベルは
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ (デフォルト)
- SERIALIZABLE
実装にはMVCCやロックが使われる
分離レベルが高くなればなるほど多くの並行性の問題を抑止することはできる。しかしその分処理速度は落ちる