非エンジニアのエンジニア道

非エンジニアからエンジニアに転向!その勉強の軌跡を載せていきます。

本を読む データベース技術[実践]入門

時間が空いてしまった!
いろいろやったけど、まとめてなかっただけなのだっ!

というわけで、本読んだことをいろいろまとめよう

感想

何となく使ってたもの、少しだけわかった気がする!
なるほどねっ!といった感じ。

直接これを見て、何かしたわけじゃないから、
具体的にできるようになったわけじゃないけど、活かせればなぁと思う。

一部ちょっと半分くらいしかわかってないところもあるので、まとめながら復習。

ざっくりメモ

ランダムアクセス

遅い

正規化

テーブル設計では正規化する

データベースが重い

だいたい効率の悪いSELECT文のせい
複数回SQL文を発行するより、joinしたほうが高速

障害の主な原因

  1. ソフトウェアの障害
  2. OSの障害
  3. ハードウェアの障害
  4. 操作ミス

ロックによる排他制御

InnoDBの場合は、ロックの範囲がレコードだが、MyISAMではテーブル単位になるため、InnoDBの方が並列性の向上に大きく貢献している。

ストレージ技術の進化

ボトルネックが、ディスクからCPUやネットワークに移ってきている。
また、並列性能の高いデータベースが求められる

ストレージエンジン

mysqlの特徴で、さまざまなレコード処理の実装方法が用意されている。

リストア

バックアップしたデータを使ってリカバリ処理をする際、MySQLから読み書きできる状態にすること

インデックス

検索を劇的に高速化できる。
ただし、インデックスを別途更新する必要があるので、更新コストは増える。
そのため、必要なものだけにつけること。

ハッスインデックス

ハッシュ値とキーのペアを持つ構造。
ハッシュ値は同じサイズになるので、固定長フォーマットに持ち込める。
ハッシュ値が衝突しないような機能はデータベースに実装されている。
ただし、範囲検索等、向かない検索処理がある。

B+Treeインデックス

効率よく、目的のデータを取得できる。範囲検索も効率的に行える。
ルートブロックを頂上にもち、ブランチブロック、最下位のリーフブロックがならぶ木構造。
ルート、ブランチでは、下位の対象のブロックがどこにあるのかという情報をもち、リーフでは、実際の格納位置の情報をもつ。

その他

インデックスを一意性の保証としても使える(一意性を保証したい列にインデックスをつけることが必須となっている。)。
低コストで重複チェックが可能。
また、AND条件で、インデックスを作ることも可能。
インデックスマージ(2個以上のインデックスを同時に使える)機能も存在する。

冗長化

最も広く用いられているのがレプリケーション

片方向レプリケーション

マスタに更新した結果が、スレーブに非同期で、伝播する。
スレーブでは、バイナリログの受信と実行の2ステップが存在する。


マスタ障害時、スレーブに結果が反映されてない状況は、2パターン存在。
バイナリログが最後まで、受信できてない、バイナリ実行ログが最後まで終わってない。


前者は非同期のため起こり、後者はSQLスレッドが遅延しているため起こる。

2ステップをそれぞれ同期方式にもすることはできる。ただし、レスポンスタイムは悪くなる。

双方向レプリケーション

マスタを複数もたせて、それぞれのマスタを更新できるようにする。
ただし、不整合が発生しないようにするため、分散型排他制御のしくみが必要。

トランザクション

データが中途半端な状態で更新を確定せず、ロールバックしたり、耐障害性を向上できる。
更新時のロックは、トランザクションの終了まで保持される。
ACID特性を持つ

  1. Atomicity:原子性  複数のSQL文をまとめて、1つの処理単位にできる
  2. Consistency:一貫性 複数デーブルにまたがる更新でも、片方だけ更新されるような矛盾した状態にならない
  3. Isolaction:独立性  参照、更新が競合しても、矛盾した状態にならないように排他制御が可能
  4. Durability:耐久性  コミットした結果は確実に保存され、復旧が可能

MySQLのログファイルの種類

エラーログファイル

MySQL本体のプロセスの起動/停止の情報、エラー情報を出力する。

スロークエリログファイル

実行に一定時間以上を要したクエリを出力する。

一般ログファイル

実行されたSQL文のすべてを出力する。

バイナリログファイル

アプリケーションからはこうされた更新系のSQL文が記録される。上記3つは解析用だが、これはリカバリやレプリケーションなどに利用されるクリティカルなファイル。

NoSQL

SQL文のような複雑な命令はなく、またテーブルのオープンクローズのコストを皆無にし、競合を減らし性能をあげている。

欠点として、トランザクションをサポートしていない、スキーマがない、主キー以外のインデックスを使えない。

最も使われる用途は、キャッシュとして使うこと。また、セッションデータでも使われる。