データベースについて
勉強記録
今回はデータベース(以下DB)とSQLについて学びました。
ちょっと長いので3つに分けてブログに書きます。
ここではDB(とくにMySQL)について学んだことをまとめます。
今日読んだ本は「Webエンジニアのためのデータベース技術[実践]入門」です。
DBとは
「一定の形式で整理された情報の集まり」のこと
多くはRDBMSのことをさす。
メモリ内だけで大量のデータを扱うことはできない
メモリは高速にアクセスしたいデータに使用する。しかし、メモリは容量も少なく揮発的なものだから、システムエラーが起きたときにデータがなくなってしまう。
永続化したいデータにはディスクを使用する。メモリよりたくさんのデータを保存できるけど、メモリに比べて読み書きが遅いのが特徴。
RDBMSの特徴
排他的制御
同じデータを複数人が同時に変更できないように制御する仕組み。
レースコンディション(競合状態)を防ぐ。
(レースコンディションとは、並列動作する複数の存在がほぼ同時にアクセスしたときに、予想外の処理結果になってしまうこと)
トランザクション
・絶対に全部の処理が終わるか →コミット(全部完了、保存)
・全くなにもなかったことにするか →ロールバック(DB側は何もなかったことに。プログラムは動いてる)
処理が中途半端な状態にはしない
ACID特性
トランザクション処理が持つべき性質のこと
原子性 / 一貫性 / 独立性 / 永続性の4つの性質のこと
(原子性)トランザクション処理は終わるか、何もなかったことにするかの2択 中途半端にしないということ
(一貫性)トランザクション処理の開始時と完了時で、データベースの条件を満たすこと
(独立性)トランザクション処理の開始時と完了時の部分しか外部からは見えないということ。隔離性とも呼ばれる
(永続性)トランザクション処理の結果がずっと変わらずに保持されるということ
インデックス
データを高速に取り出す機能。SELECT文を早くする機能でテーブルに対してつける
障害が起こりそうなところにあらかじめつけるのが良い
(あとからつけることもできるが、テーブルの変更は非常に困難なので、ちゃんとテーブル設計をして先につけるのが良い)
⭐︎WHEREとORDER BY で指定しているカラムにはインデックスをつけることが多い(例外あり)
MySQLではデェフォルトでid(プライマリーキー)にインデックスが貼ってある。
インデックスがついてなかったら、WHEREの度にfor文のように1個1個まわして探さないといけない→インデックスがついていればすぐに飛べる
アクセスが増えるとSELECT文が遅くなり、サイトが重い→サーバーが落ちる原因になる。
一意性
ユニークキー制約(例えばIDとか、複数は×)
レプリケーション
障害対策
本番とは別にバックアップ用のMySQLサーバーをつくる
バイナリログにMySQLのログが残っている
本番用をマスター、バックアップ用をスレイブまたはレプリカと呼び、中身のデータは同じで本番用でバグが起こっても大丈夫なようにしている
耐障害性
トランザクション機能により耐障害性が向上
更新の記録をとっていて、障害直前までのコミット結果を失わずに済むようになっている