この記事では、MySql のインデックス、ロック、トランザクションに関する知識のポイントをまとめています。ご参考までに、詳細は以下の通りです。 1. 索引索引は本の目次に似ており、目次のページ番号に基づいて対応するレコードをすぐに見つけることができます。 インデックスの利点:
インデックス作成の欠点:
実装の観点から、インデックスはクラスター化インデックスと補助インデックス(セカンダリインデックスまたは非クラスター化インデックスとも呼ばれる)の2つのタイプに分けられます。 機能的には、通常のインデックス、ユニークインデックス、主キーインデックス、複合インデックス、外部キーインデックス、フルテキストインデックスの 6 種類があります。 6 種類のインデックスについて詳しく説明します。
さらに、InnoDB はデータを主キーでクラスター化します。主キーとクラスター化インデックスが定義されていない場合、MySql は代わりに一意の空でないインデックスを選択します。そのようなインデックスがない場合、6 バイトの主キーがクラスター化インデックスとして暗黙的に定義されますが、ユーザーはこれを表示したりアクセスしたりすることはできません。 簡単に言えば:
MySql はデータをページに保存し、デフォルトのページ サイズは 16kb です。クエリを実行すると、特定のデータが読み込まれるだけでなく、そのデータが配置されているすべてのページが pageCache に読み込まれます。これは実際には、OS の近接アクセスの原則に似ています。 MySql のインデックスは B+ ツリー構造を使用します。 B+ ツリーについて説明する前に、まず B ツリーについて説明します。B ツリーは、多方向バランス検索ツリーです。通常のバイナリ ツリーと比較して、極端に不均衡になることはなく、多方向でもあります。 B ツリーの特徴は、ページ以外の子ノードにもデータを格納することです。 写真からわかるように: この機能は、ページ以外の子ノードが大量のインデックスを保存できないことを意味します。 B+ ツリーは、この目的のために B ツリーを最適化します。次の図に示すように: B+ ツリーではすべてのデータがリーフ ノードに格納され、子以外のノードにはインデックスとポインターのみが格納されていることがわかります。 非ページ子ノードは 16kb、各インデックス、つまり主キーは bigint、つまり 8b、ポインターは 8b であると想定します。すると、各ページには約 1000 個のインデックス (16kb/8b + 8b) を保存できます。 3 層 B+ ツリーはいくつのインデックスを保存できますか?以下のように表示されます。 約 10 億個のインデックスを保存できます。通常、B+ ツリーの高さは 2 ~ 4 層です。MySQL の実行中はルート ノードがメモリ内に常駐するため、各検索に必要な IO は 2 ~ 3 回程度です。 B+ツリーの設計は、機械ディスクの特性に基づいていると言えます。 インデックスの設計がわかれば、他の情報もわかります。
したがって、プロジェクトでシャーディングを使用する場合、通常はシャーディング用の主キーが必要になりますが、どうすればよいでしょうか?実装の面では、自動インクリメント主キーを保持し、論理主キーを一意のインデックスとして使用することができます。 2. ロック機構MySQL のロックに関しては、さまざまな概念が出てきます。実際、ロックにはいくつかの側面があります。説明しましょう。 1. タイプディメンション
タイプ別内訳:
2. ロックの粒度(粒度ディメンション)
3. ロックアルゴリズム(アルゴリズムディメンション)
4. デフォルトの読み取り操作はロックされていますか?
手動でロックすることを選択できます: 更新の場合は xxxx を選択します (排他ロック)。共有モードで xxxx ロックを選択します (共有ロック)。これは「一貫性のあるロック読み取り」と呼ばれます。 ロックを使用した後、RR レベルでファントム リードが回避されます。もちろん、デフォルトの MVCC 読み取りでもファントム読み取りを回避できます。 RR はファントム リードを防止できるので、SERIALIZABLE は何の役に立つのでしょうか? 更新の損失を防ぎます。たとえば、次の図: このとき、シリアル読み取りには SERIALIZABLE レベルを使用する必要があります。 最後に、行ロックの実装原則は、クラスター化インデックスをロックすることです。クエリ時にインデックスに正しくヒットしない場合、MySql オプティマイザは行ロックを放棄し、テーブル ロックを使用します。 3. 取引トランザクションは、データベースにおける永遠のテーマであり、ACID (原子性、一貫性、独立性、永続性) です。 4 つの特性のうち、最も重要なのは一貫性です。一貫性は、原子性、独立性、永続性によって保証されます。
それでは、隔離について話しましょう。 分離レベル:
各レベルは異なる問題を解決しますが、通常はダーティ リード、反復不可能なリード、ファントム リードの 3 つの問題を解決します。古典的な写真: ここで、ファントム リードについて注意すべき点があります。データベースの仕様では、RR レベルではファントム リードが発生します。ただし、MySQL の最適化により、MySQL の RR レベルではファントム リードは発生しません。デフォルトの選択を使用する場合、MySQL は MVCC メカニズムを使用して、ファントム リードが発生しないことを保証します。ロックを使用することもできます。更新 (X ロック)、共有モードでのロック (S ロック) などのロックを使用する場合、MySQL は Next-Key Lock を使用して、ファントム リードが発生しないことを保証します。前者はスナップショット読み取りと呼ばれ、後者は現在の読み取りと呼ばれます。 原則分析:
では、RR と Serializble の違いは何でしょうか? A: 更新が失われました。この記事のロック部分について言及しました。 MVCC の概要: 正式名称はマルチバージョン同時実行制御です。 innoDB の各クラスター化インデックスには、主キー (RowID)、最新の変更のトランザクション ID (MVCC コア)、Undo ログのポインター (分離コア)、およびインデックス削除マーク (削除時にすぐに削除されるのではなく、マークされてから非同期的に削除されます) の 4 つの隠しフィールドがあります。 基本的に、MVCC は Undo Log リンク リストを使用して実装されます。 MVCC 実装方法: トランザクションは排他ロックで元のデータを変更し、変更前のデータを Undo ログに保存し、そのデータをロールバック ポインターに関連付けます。変更が成功した場合は何も行われません。変更が失敗した場合は、Undo ログのデータが復元されます。 もう 1 つ、通常、MVCC はバージョン番号を使用するという点で楽観的ロックに似ていると考えられていますが、実際には InnoDB はこのように実装されていません。もちろん、これは MySql の使用には影響しません。 MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
>>: jQueryはドロップダウンメニューのスライド効果を実現します
目次シンプルなSpringbootプロジェクトを作成する1. pom.xmlでSpring Boot...
序文通常のユーザーはcrontabスケジュールタスクを定義します。たとえば、Oracleユーザーはス...
質問:私のブログのエンコーディングは utf-8 です。ページを開くと空白になっていることもあります...
目次vueカスタムディレクティブグローバル指令ローカル指示使用フック関数(両方ともオプション)使用方...
目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...
目次1. 存在する1.1 説明1.2 例1.3 交差/2017-07-21 2. 除く2.1 説明2...
検証環境: [root@~~/]# rpm -qa | grep mysql mysql-5.6.2...
1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...
序文スタートアップ企業が最初はモノリシック アプリケーションを主要なアーキテクチャとして使用し、通常...
Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...
目次1. ロックとラッチ2. 繰り返し読み取り3. インサートロックプロセス3.1 ロックモード3....
目次前面に書かれた解決策 1: グローバル スタイル オーバーライドを使用する (フロントエンドに共...
Centos6.5にmysql5.7.19をインストールするための詳細な手順は次のとおりです。 1....
なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...
この記事では、jQueryプラグインを使用してマインスイーパゲームを実装する2番目の記事を参考までに...