MySQL データベースのインデックスとトランザクション

MySQL データベースのインデックスとトランザクション

1. 索引

1.1 コンセプト

  • インデックスは、テーブル内のデータ行の取得を高速化するために作成される分散ストレージ構造です。インデックスはテーブルに対して作成されます。インデックスはデータ ページ以外のインデックス ページで構成されます。インデックス ページの各行には、物理​​データの取得を高速化するための論理ポインターが含まれています。
  • データベース ダイアグラムでは、選択したテーブルの [インデックス/キー] プロパティ ページで各インデックス タイプを作成、編集、または削除できます。インデックスは、それが添付されているテーブルを保存するとき、またはテーブルが存在する関係グラフを保存するときに、データベースに保存されます。

簡単に言えば、データベース内のインデックスとテーブルとデータの関係は、本棚にある本 (テーブル)、本の内容 (データ)、本のカタログ (インデックス) の関係に似ています。

1.2 機能

データベース システムでインデックスを作成する主な機能は次のとおりです。

  • 迅速なデータ取得
  • データレコードの一意性を確保する
  • テーブル間の参照整合性を実装する
  • 在使用order by、 、インデックスを使用すると並べ替えとグループ化の時間を短縮できます。

1.3 索引作成の原則

1.3.1 ディスクアクセス回数を減らすことがインデックス構築の核となる考え方

インデックスの目的はクエリを容易にすることです。
MySQLクエリは主にselectです。select select基本的な実行プロセスには、テーブルをトラバースし、各レコードを順番に取り出し、where句の条件に従ってフィルタリングすることが含まれます。MySQLはハードディスクにデータを保存するため、クエリを実行するときは、各レコードがハードディスクにアクセスすることを意味します。IOデバイスのハードディスクへのアクセス効率は、メモリへのアクセス効率よりもはるかに低くなります。したがって、ディスクアクセス回数を減らすとクエリの効率が向上します。これがインデックス構築の核心的な考え方です。

1.3.2 B+ツリーは基礎となるインデックスの実装に適している

データへのアクセス回数を減らすことは、インデックスを実装する際に重要な考え方です。次に、いくつかのデータ構造を分析して、インデックスを実装するためのより適切なデータ構造を見つけます。

二分探索木:

二分探索木は単一枝木である可能性があるため、時間計算量はO(N)である。

AVLツリー:

  • AVL ツリーは、本質的にはバイナリ バランス サーチ ツリーであり、バイナリ サーチ ツリーを改良したものです。左サブツリーと右サブツリーの高さの差が 1 を超えないこと、つまり単一ブランチ ツリー構造が存在しないことが保証され、検索時間の複雑さは O(logN) です。
  • 左と右のサブツリーの高さの差は 1 を超えてはならないため、挿入または削除操作によって AVL ツリーの構造が破壊されます。そのため、ツリーはいつでも調整する必要があります。クエリの効率は満たされているものの、挿入と削除の操作の効率は低下し、挿入と削除の時間計算量はO(logN)となる。

赤黒木:

  • 赤黒木は、本質的にはルールが緩和された AVL 木です。つまり、左と右のサブツリーの高さの差が 1 以下になることを強制しないため、挿入および削除操作の効率を確保するための要件が​​低くなります。
  • AVLツリーとクエリ、挿入、削除の時間計算量の全体的な違いはO(logN)です。

ハッシュテーブル:

  • ハッシュテーブルのクエリ、挿入、削除の時間計算量は O(1) です。
  • しかし、ハッシュ テーブルの重要なポイントの 1 つは、等しいかどうかを比較する必要があるが、より大きい、より小さいなどの条件は達成できないため、実際のクエリ状況に適合しないことです。

今のところ、MySQL インデックスの実装には AVL ツリーまたは赤黒ツリーのどちらか一方がより適しているようです。この 2 つのデータ構造の検索効率はツリーの高さによって直接決まります。したがって、データが増えるとツリーの高さも増えます。

さらに最適化するには、N 項検索ツリーを使用してツリーの高さを減らし、ディスク IO を減らして検索効率を向上させることができます。

Bツリー:

BツリーはN分探索木の一種である。

Bツリーの例の構造:

ここに画像の説明を挿入

インデックスで使用される各ノードはレコードを表す

Bツリーの特徴:

  • 各ノードにはN個のサブツリーが含まれる可能性がある
  • 各ノードには複数の値がある場合があります。
  • 左のサブツリーの値はすべてルートノードの対応する値よりも小さく、右のサブツリーの値はすべてルートノードの対応する値よりも大きい

B+ツリー:

B+ ツリーは、B ツリーの改良版である特殊な N 項検索ツリーです。

B+ツリーの例の構造:

ここに画像の説明を挿入

B ツリーに対する B+ ツリーの改良点:

  • リーフ ノードはレコードの各行を格納し、非リーフ ノードは各行のインデックス値のみを格納する必要があります。
  • 非リーフノードの値が繰り返され、リーフノード層が完全なデータセットになります。
  • すべてのリーフ ノードは、リンク リストと同様の方法で接続できます。

B+ツリーの利点:

  • 範囲検索が得意
  • すべてのクエリがリーフノードに届くため、クエリ速度は比較的安定しています。
  • リーフ ノードは完全なデータ セットであるため、リーフ ノードはハード ディスクに保存でき、非リーフ ノードはメモリに直接保存できるため、ハード ディスクの読み取り回数が大幅に削減されます。

1.4 適用可能なシナリオ

  • 検索回数は比較的多いですが、挿入や削除の回数は比較的少ないため、インデックスの使用に適しています。
  • インデックス自体も一定のスペースを占有するため、ディスク容量が不足している場合はインデックスの使用は適していません。
  • インデックスは列を指定して作成します。列の区別度合いが大きい場合は、自動インクリメントの主キーなどのインデックスを使用するのが適しています。

1.5 使用上の注意

補充:

primary key制約、一意制約、または外部キー制約を作成すると、対応する列のインデックスが自動的に作成されます。

1.5.1 インデックスを表示

文法:

テーブル名からインデックスを表示します。

例:

ここに画像の説明を挿入

1.5.2 インデックスの作成

文法:

テーブル名 (フィールド名) にインデックス インデックス名を作成します。

例:

ここに画像の説明を挿入

1.5.3 インデックスの削除

文法:

テーブル名のインデックス インデックス名を削除します。

例:

ここに画像の説明を挿入

知らせ:

プライマリ インデックスは削除できません。削除するとエラーが報告されます。

2. 取引

2.1 コンセプト

物事: コンピューターでは非常に広い概念であり、一般的には実行すべきことや実行したことを指します。リレーショナル データベースでは、トランザクションは SQL ステートメント、SQL ステートメントのグループ、またはプログラム全体になります。

簡単に言えば、たとえば銀行振込操作で、A が B に 500 元を送金すると、この操作には実際には 2 つの操作が含まれます。A の口座残高は 500 元減少し、B の口座残高は 500 元増加します。

物事は、この一連のアクションを 1 つにまとめたもの、つまり何もしないかすべてを行うかのいずれかに相当します。

2.2 トランザクションを使用する理由

上記の銀行振込の例を使用して、口座 A から 500 元を減額する操作は成功したが、口座 B から 500 元を増額する操作は成功しなかった場合、振込操作は失敗となります。

物事の核となる特性は、一連の操作をまとめて全体を形成することです。操作はすべて完了するか、まったく完了しないかのどちらかです。

何もしないということは、操作が失敗した場合、その時点の中間状態が秘密裏に復元されることを意味します。

したがって、物を使用することで、一連の操作が部分的にしか完了せず、完全に完了するか、まったく完了しないことを保証できます。

2.3 4つの主要な属性

トランザクションは、リカバリと同時実行制御の基本単位です。トランザクションには、原子性、一貫性、永続性、分離性の 4 つの特性があります

物事の核心は原子性である

2.3.1 原子性

コンセプト:

トランザクションは、分割できない作業単位です。トランザクションに含まれる操作は、すべて完了するか、まったく完了しないかのいずれかです。

物事の核心は原子性であり、原子性の核心は中間状態へのロールバックであり、中間状態へのロールバックの核心はロールバックであり、ロールバックの核心は操作の各ステップを記憶することです。

2.3.2 一貫性

コンセプト:

トランザクションは、データベースをある一貫した状態から別の一貫した状態に変更する必要があります。一貫性と原子性は密接に関連しています。

トランザクションの実行前と実行後、現在のテーブル内のデータは適切な状態にあります

2.3.3 永続性

コンセプト:

永続性とは、 permanenceがコミットされると、データベース内のデータに加えられた変更が永続的になることを意味します。その後の他の操作や障害は、これに何ら影響を与えないはずです。

トランザクション操作のデータはハードディスク上で直接操作され、ハードディスク上のデータは永続的です。

2.3.4 分離

コンセプト:

トランザクションの実行は他のトランザクションによって妨害されることはありません。つまり、トランザクション内で使用される操作とデータは他の同時トランザクションから分離されており、同時に実行されるトランザクションは互いに干渉できません。

2.4 使用法

開いたもの:

トランザクションを開始します。


複数のSQL文を実行する

ロールバックまたはコミット

-- ロールバック: 上記のすべての SQL ステートメントがロールバックに失敗したことを示します。

-- 送信: 上記のすべての SQL ステートメントが正常にコミットされたことを示します。

これで、MySQL データベースのインデックスとトランザクションに関するこの記事は終了です。MySQL のインデックスとトランザクションに関するより詳しい情報については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベース テーブルのロック、ロック解除、およびトランザクションの削除の詳細な説明
  • MySQL データベース トランザクション例のチュートリアル
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • GolangはMySQLデータベーストランザクションの送信とロールバックを実装します
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • MySQL データベース トランザクションにおけるダーティ リード、ファントム リード、非反復リードの詳細な説明

<<:  CentOS7 で ethereum/Ethereum を最初からインストールする

>>:  HTMLがHikvisionカメラのリアルタイム監視機能を実現

推薦する

MySQL の重要なログファイルの包括的なインベントリ

目次導入ログ分類パラメータファイルエラーログファイル完全なログファイルスロークエリログバイナリログフ...

Docker デプロイメント Springboot プロジェクト例の分析

この記事は主に、docker デプロイメント springboot プロジェクトのサンプル分析を紹介...

MySQLデータベースのパスワードを忘れた場合の解決策

先ほど MySQL パスワードを設定したのに、外食したり荷物を受け取ったりするときにパスワードを忘れ...

Angularの親子コンポーネント通信の詳細な説明

目次使用されるAPI簡単な例人.ts親コンポーネントサブコンポーネント効果要約する使用されるAPI ...

VMware12 で Ubuntu19.04 デスクトップ版をインストールする (インストール チュートリアル)

1. 実験の説明仮想マシンに、 Ubuntu 19.04オペレーティングシステムを手動でインストー...

MySQL 8.0.26 のインストールと簡易チュートリアル (インターネット上で最も完全)

目次1. MySQLをダウンロードする1.1 ダウンロード1.2 インストール1. MySQLをダウ...

jQuery タグセレクターの適用例の詳細な説明

この記事では、jQueryタグセレクターアプリケーションの具体的なコードを例として紹介します。具体的...

CSSでフォントアイコンを使用する方法をお教えします

まず、フォントアイコンとは何でしょうか?表面的にはアイコンですが、実際はテキストです。テキストの設定...

CentOS の環境変数と設定ファイルの詳細な説明

序文CentOS 環境変数設定ファイル システムは階層型システムであり、他のマルチユーザー アプリケ...

vue.config.js からプロジェクト最適化までの vue2.x 構成

目次序文vue.config.js 構成オプションパッケージサイズを縮小するためのパッケージの最適化...

MySQL クエリ キャッシュのグラフィカルな説明

目次1. 原則の概要クエリキャッシュシステム変数1. クエリキャッシュを持つ2. クエリキャッシュ制...

1 つの記事で Vue ミドルウェア パイプラインを学ぶ

SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザ...

ネガティブマージン関数の紹介と使用方法の概要

1998 年の CSS2 勧告の時点で、テーブルは徐々に舞台から消え、歴史の中に記録されるようになり...

protobuf の簡単な紹介と Ubuntu 16.04 環境でのインストールチュートリアル

protobufの簡単な紹介Protobuf は、Google のオープンソースのシリアル化プロトコ...

Vueはmockjsを使用してシミュレートされたデータケースの詳細を生成します

目次プロジェクトにmockjsをインストールするVueプロジェクトでmockjsを使用する基本的なプ...