データベース - Part2 : DBMS

DBMSとは

データベースとは、一般的にコンピュータシステムから電子的に保存・アクセスされる、整理されたデータの集合体です。データベースがより複雑な場合、多くは正式な設計およびモデリング手法を使用して開発されます。 データベース管理システム (DBMS) は、エンドユーザー、アプリケーション、およびデータベース自体と対話してデータをキャプチャおよび分析するソフトウェアです。DBMSソフトウェアにはさらに、データベースを管理するために提供される主要な機能が含まれています。

定義

ConnollyとBeggは、データベース管理システム (DBMS) を「ユーザーがデータベースへのアクセスを定義、作成、維持、制御できるようにするソフトウェアシステム」と定義しています。

その核心となる機能は、データの保存、検索、更新です。

基本的に、DBMSは以下の機能をサポートしています。

  • データの保存、検索、更新
  • メタデータを記述した、ユーザーがアクセス可能なカタログまたはデータ辞書
  • トランザクションと同時実行性のサポート
  • データベースが破損した場合の回復機能
  • データへのアクセスおよび更新の承認(認可)のサポート
  • 遠隔地からのアクセスサポート
  • データベース内のデータが特定のルールに従うことを保証するための制約の強制

RDBMS

リレーショナルデータベース(関係データベース、文化語:リレーショナルデータベース、関係データベース、RDB)は、キーと値の単純な関係を表形式にした、非常に単純な原理を持つコンピュータ情報データベースです。これは、1970年にエドガー・F・コッド(Edgar F. Codd)によって提案されたデータ関係モデルに基づくデジタルデータベースです。

アーキテクチャ

Architecture

クエリキャッシュ

これは、読み取りが多く書き込みが少ない環境で非常に役立ちます。
クエリは、大文字と小文字を区別して検査されます

SELECT * FROM t != select * from t

コメントも考慮され、クエリが異なるとみなされる場合があります

/* retry */SELECT * FROM t != /* retry2 */SELECT * FROM t

制限事項

OQGRAPHを使用するには、クエリキャッシュを無効にする必要があります。

Spiderストレージエンジン(その他多数)では、クエリキャッシュは使用されません。

“5.5.40-galera”、”10.0.14-galera”、および”10.1.2”より前のMariaDB Galeraクラスターバージョンでも、クエリキャッシュを無効にする必要があります。

クエリオプティマイザ

クエリオプティマイザは、本質的にデータベースのリレーショナルエンジンの動作方法を「モデル化」するソフトウェアの一部です。クエリプロセッサツリーとデータに関する統計情報を使用し、モデルを適用して、クエリを実行するための最適な方法と考えられるものを導き出します。つまり、実行計画を生成します。

コストベース

データへのアクセスにインデックスを使用できるか、どのような種類の結合を使用するかなどを決定します。オプティマイザによる決定は、特定の実行計画に必要なCPU処理とI/O、および実行速度の観点から計算されたコストに基づいています

自明な計画 (Trivial plan)

インデックスがなく、クエリ内に集計や計算もない単一のテーブルの場合、オプティマイザは絶対的な最適計画を計算しようとして時間を費やすのではなく、単純に単一の計画を適用します

オプティマイザが実行計画に到達すると、実際の計画が作成され、plan cache(プランキャッシュ)と呼ばれるメモリ領域に保存されます(同一の計画がまだキャッシュに存在しない場合)。 オプティマイザは潜在的な計画を生成する際、それらをキャッシュ内の以前に生成された計画と比較します。一致するものが見つかった場合、その計画を使用します。

クエリ実行計画

実行計画には2つの異なるタイプがあります。まず、オプティマイザからの出力を表す計画があります。これは「推定実行計画 (Estimated execution plan)」と呼ばれます。計画内の演算子やステップは、オプティマイザの計画の見解を表しているため、論理的 (logical) というラベルが付けられます。

次は、実際のクエリ実行からの出力を表す計画です。このタイプの計画は、面白いことに「実際の実行計画 (Actual execution plan)」と呼ばれます。これは、クエリが実行されたときに実際に何が起こったかを示しています。

トランザクション

データベース管理システム(DBMS)が効率的かつ正確に動作するためには、ACIDトランザクションが必要です。

インデックス

CREATE TABLE students (
    id INT NOT NULL,
    first_name VARCHAR(16) NOT NULL,
    PRIMARY KEY (id),
    INDEX index_first_name (first_name)
);

SELECT * FROM students WHERE first_name = 'GiPyeong';

MyISAM

クラスタ化インデックスはセカンダリインデックスと同じ構造です。セカンダリインデックスはクラスタキーを持っています。 つまり、クラスタ化インデックスの場合、セカンダリインデックスが変更されると、データレコードのアドレスを変更する必要があります。

  1. レコードアドレスを取得するために index_first_name を検索します。
  2. レコードアドレスを使用して結果を取得します。

InnoDB

すべてのセカンダリインデックスは主キーインデックスを格納します。そのため、セカンダリインデックスが変更されたときにデータレコードのアドレスを変更する必要はありません。

  1. index_first_name を検索し、主キーの値を取得します。
  2. 主キーを使用してレコードアドレスを取得します。
  3. レコードアドレスを使用して結果を取得します。

ACID

  • 原子性 (Atomicity)
    • 原子性は、各トランザクションが単一の「ユニット」として扱われることを保証します。
  • 一貫性 (Consistency)
    • データベースに書き込まれるすべてのデータは、制約、カスケード、トリガー、およびそれらの組み合わせを含む、すべての定義されたルールに従って有効でなければなりません。一部のトランザクションが上記のルールを無視する場合、そのトランザクションはキャンセルされる必要があります。
  • 独立性 (Isolation)
    • トランザクションは頻繁に同時に実行されます(例:複数のトランザクションが同時にテーブルを読み書きする)。独立性は、トランザクションの同時実行が、トランザクションが順次実行された場合に得られるのと同じ状態をデータベースに残すことを保証します。独立性は、同時実行制御の主な目標です。
  • 耐久性 (Durability)
    • トランザクションがいったんコミットされると、システム障害(停電やクラッシュなど)が発生した場合でも、コミットされたままになります。

結論

ACIDに基づくDBMSのトランザクションについて理解しましょう。 次回はRDBMSの正規化について投稿するかもしれません。 RDBMSの正規化は、整合性を維持するためのプロセスです。

Stay Hunger, Stay Foolish

付録