最近、仕事でRMSDBやNoSQL関係の設計などで苦労をしていたので、基礎知識の復習を兼ねて『データベースエンジニア養成読本』を読みました。全般的にRMSDBやNoSQLの主要な製品の概要やSQLなどの基礎知識を体系的に知ることができる本です。
今回はいつ戻おり、自分の頭を整理するための俺得メモです。
(わかりにくい部分が多いと思いますが、ご容赦ください)
😎 DBの需要な機能
DBが一般的に持っているトランザクションのACID属性はアプリケーションの実装を楽にするために重要な機能である。
Atomicity (原子性) => トランザクションに含まれるタスクが全て実行、or 全く実行されないことを保証する性質 Consistency (一貫性) => トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質 Isolation (独立性) => トランザクション中に行われる操作の過程が他の操作から隠蔽されること Durability (永続性) => トランザクション操作の完了通知をユーザが受けた時点で、その操作は永続的となり、結果が失われないこと
上記の説明は、ACID (コンピュータ科学) Wikipedia)
🐠 InnoDB、MyISAMとは
MySQLのデータベースエンジン「InnoDBとMyISAM」について。
InnoDB => ロック方式が行ロック MyISAM => ロック方式がテーブルロック。テーブル自体にロックがかかるため、重い処理を実行すると処理待ちが発生しやすくなる。
😼 NoSQLの特徴
Web系システムを中心として次の「3V」と呼ばれる課題が発生しや少なった。
Volume => データ量 Variety => データの種類 Velocity => データ発生 / 処理頻度 / 速度
その課題に特化した解決策として、NoSQLが台頭し始めた。
しかしながら、NoSQLがRDBMSに置き換わるようなものではない。理由としては、
1) NoSQLは特定の問題を解決するためにRDBMSの持ついくつかの機能を犠牲にしている 2) NoSQLは歴史が浅く、技術として十分に使い古されておらず、ノウハウも不足している
🐞 カラムファミリー型のデータベース: Bigテーブルなど
複数の列をまとめたカラムファミリーの単位でデータを取り出す。
実際のデータは、行、カラムファミリー、列をキーとしてそれらを辞書順にソートされたKVSのような形でデータを保持している。
カラムファミリー型DBの得意分野は、当単位での入力・検索を高速に行うようなOLTP(OnLine Transaction Processing)
である。一方で、RDBMSは格納データに複雑な集計を行う計算などに向いている。使い方がまったく異なることに注意が必要。
🏀 Redisについて
すべてのデータをメモリ上にもつ「インメモリデータベース」として、高速に動作。メモリ上のデータをディスクに保存し、永続化する。
Redisは次のデータ型をもつ。
String: 文字列 List: 配列 Set: 集合 Hash: 連想配列 Sorted Set: スコア付き集合
Redisはシングルプロセス、シングルスレッドのイベント駆動アーキテクチャを採用しているので多くの処理をアトミックに行える。
Redisが有効な用途の一例。
リアルタイムランキング => Sorted Set型を使用すると高速にランキング処理を行うことができる アクティブユーザーの集計 => Set型を利用して、集合操作関数を利用すればいろいろなデータを取得できる
🍄 Riakについて
Riakの特徴は次のとおり。
高可用性) 多少のハードウェアやネットワークの故障でシステムが停止することなく、どんなときも書き込みと読み出しができる 高信頼性) 多少の負荷でもシステムは安定したレスポンスとスループットを提供する 拡張性) データ量や負荷に応じて、無停止でシステムをスケールアウトさせることができる 低遅延) どんなときでも、ユーザーを待たせず、すぐにレスポンスを得ることができる 予測可能性) 性能予測を裏切らない、安定したスケールアウト性
Riakを利用すべきシーン。
・データ量が数倍のレベルで増減する ・簡単にスケールアウトしたい ・複数行のトランザクションやJOINがない ・スパイク時でも安定したレイテンシが欲しい ・故障時の運用を簡単にしたい ・アインしんして夜に眠りたい
ちなみに、GitHub Pagesの静的ファイルはすべてRiak上に保存されている。
🍮 SQLの基礎
SQLの種類。
データ操作言語(DML: Data Manipulation Language) select/insert/update/deleteなど データ定義言語(DDL: Data Definition Language) テーブル作成やフィールのデータ型の変更など データ制御言語(DCL: Data Control Language) ユーザーの作成や権限の設定、排他制御の管理など