📝
読書感想文『第2版おうちで学べるデータベースのきほん』
はじめに
『第2版おうちで学べるデータベースのきほん』を読んだので、内容の振り返りと感想を残します。
モチベーション
筆者はフロントエンドエンジニアですが、業務で必要なデータの抽出くらいは自分でできるようになりたいと思い、この本を手に取りました。
振り返り
以下各章のメモです。
Chapter 1 データベースって何だろう ~その用途と役割~
- データベースはシステムの「裏側」に存在している本丸のような存在
- データベースは以下の機能がある
- 検索と更新
- 同時実行制御
- 耐障害性
- セキュリティ
- 現在の主流はリレーショナルデータベースである
- 他にも多様なデータベースが登場してきている
Chapter 2 リレーショナルデータベースって何だろう ~最も代表的なデータベース~
- リレーショナルデータベースとはデータを2次元表で管理するデータベースである
- リレーショナルデータベースは SQL で操作できる
- MySQL は DBMS の1つである
- DBMS はミドルウェアである
- データベースはユーザーとアプリケーションを仲介する
Chapter 3 データベースにまつわるお金の話 ~イニシャルコストとランニングコスト~
- システムにかかる費用として「イニシャルコスト」と「ランニングコスト」に分類できる
- サポートなしのソフトウェアは危険である
Chapter 4 データベースとアーキテクチャ構成 ~堅牢かつ高速なシステムを構築するために~
- アーキテクチャ設計は重要である
- 可用性を担保するためには腎臓戦略が主流である
- 同じ機能を持つコンポーネントを並列させることをクラスタリングという
- クラスタ構成を組んでシステムの稼働率を高めることを冗長化という
- 最も基本的な冗長化は DB サーバーのみを冗長化することである
- Active - Active とはクラスタを構成するコンポーネントが同時に稼働させることである
- Active - StandBy とは稼働している Active と待機している StandBy があることである
- StandBy が Active に切り替わる動作をフェイルオーバーという
- Active - Active はフェイルオーバーを防止できる
- コスト面を考えると Active - Active は贅沢な構成である
- データベースサーバとストレージのセットを複数用意することをレプリケーションという
- レプリケーションではデータの整合性を取るためにデータの同期が必要である
- シェアードエブリシングとは複数のサーバが1つのストレージを使用している構成である
- シェアードナッシングとはネットワーク以外のリソースをすべて分離している構成である
- クラウドではマルチ AZ(Availability Zone) 構成で可用性を高める
- アーキテクチャは後から変更することが難しい
Chapter 5 DBMSを操作する際の基本知識 ~操作する前に知っておくこと~
- DBMS にログインすることでコマンドを実行できるようになる
- コネクションとはユーザーと DBMS の接続が確立された状態である
- セッションとはコネクションの開始から終了までの単位である
- データベースは階層構造である
- MySQL は 3 層構造だが PostgreSQL は 4 層構造である
- 正しさの観点では ANSI が定めている 4 層構造である
- 階層はインスタンス/(データベース)/スキーマ/オブジェクトである
Chapter 6 SQL文の基本を学ぼう ~SELECT文を理解する~
- SELECT 文は
SELECT 列名 FROM テーブル名; - 条件を指定するには
SELECT 列名 FROM テーブル名 WHERE 条件; - 行の重複した値を排除する場合は
SELECT DISTINCT 列名 FROM テーブル名 WHERE 条件; - 検索結果はデフォルトで昇順である
- 検索結果を降順に並び替えるには
SELECT 列名 FROM テーブル名 ORDER BY DESC; - 検索結果の行の順番を一意にするにはユニークなソートキーを設定する
- COUNT はテーブルの行数を数える関数である
SELECT COUNT(列名) FROM テーブル名 WHERE 条件; - SUM は数値列の合計を数える関数である
- AVG は数値列の平均を数える関数である
- GROUP BY でグループに分けて集約する
SELECT COUNT(列名) FROM テーブル名 WHERE 条件 GROUP BY 列名; - 集約した結果に条件を指定する
SELECT COUNT(列名) FROM テーブル名 WHERE 条件 GROUP BY 列名 HAVING COUNT(列名) = 数値; - UPDATE 文はデータを変更する
UPDATE テーブル名 SET 列名 = 値; - 条件を指定するには
UPDATE テーブル名 SET 列名 = 値 WHERE 条件; - INSERT 文はデータを挿入する
INSERT INTO テーブル名 (列1 列2 ...) VALUES (値1 値2 ...); - DELETE 文はデータを削除する
DELETE FROM テーブル名; - 条件を指定するには
DELETE FROM テーブル名 WHERE 条件;
Chapter 7 トランザクションと同時実行制御 ~複数のクエリをまとめる~
- トランザクションとは複数のクエリを一貫性のある形でひとまとまりにして扱うこと
- ACID 特性とは
- Atomicity(原子性)
- Consistency(一貫性)
- Isolation(分離性)
- Durability(持続性)
- Atomicity(原子性)とはデータの変更を伴う一連のデータ操作が「全部成功」するか「全部失敗」するかを保証する仕組みである
- Durability(持続性)とは操作結果が永続的となり結果が失われないことである
- MySQL は MVCC(Multi Version concurrency Control)を用いている
- 「更新」と「読込」は互いにブロックしない
- 「読込」内容は分離レベルにより内容が変わる場合もある
- 「更新」の際はロックを取得する
- 「更新」と「更新」は後から来たトランザクションがロックを取得しようとしてブロックされる
- リピータブルリード(RR)は初回クエリを発行した時点でコミットされているデータを読み取る
- リードコミッテッド(RC)はクエリを発行した時点でコミットされているデータを読み取る
- ロックタイムアウトとは「更新」と「更新」がぶつかった時に後から来た「更新が」どの程度待機するかの設定である
- デッドロックとはロックが無限に続く状態である
- トランザクションがデッドロックを起こしてロールバックされた場合でもトランザクションを再実行できるようにしておく必要がある
- トランザクションのアンチパターン
- オートコミット
- ロングトランザクション
Chapter 8 テーブル設計の基礎 ~テーブルの概念と正規形~
- テーブル名は必ず複数形か集合名詞にする
- 最も上位の概念でテーブルを作成する
- 主キーを必ず設定する
- テーブルは関数である
- 主キーとその他の列との間には関数的な関係がある
- テーブル同士の関係性は ER 図で表現する
- エンティティとはテーブルである
Chapter 9 バックアップとリカバリ ~障害に備える仕組み~
- ログ先行書き込み(WAL:Write Ahead Log)とはまずはログとして変更を記録し DB に同期する仕組みである
- MySQL ではこのログを InnoDB ログという
- DBMS ではデータベースバッファを経由してデータファイルへの入出力を一本化し単純化している
- ロールフォワードとはクラッシュ時までにコミットされた最新の状態に戻すことである
- ホットバックアップとは DB を止めずにバックアップデータを取得するものである
- コールドバックアップとは DB を止めてバックアップデータを取得するものである
Chapter 10 パフォーマンスを考えよう ~性能を向上させるために~
- 特定の処理を単位時間あたりに何件処理できるかの指標をスループットという
- クエリ処理の実行計画を決める内部プログラムをオプティマイザという
- レンジスキャンを実行するためにはインデックスが必要である
感想
まずは読んでいて面白かったです。普段クエリを書くことがないので、そもそもの概念を理解できたことが収穫でした。
実際に手元でクエリを書いて動作確認もできたので、新鮮な気持ちでした。改めて業務ではクライアントサイドしかやっていないなとも思いました。
「インデックス貼ってなかった〜」みたいな会話もこれで少しわかった気になれます。
学ぶとかなり奥が深そうですが、ひとつひとつミックさんの書籍で学習していきます。
Discussion