シナリオ 1. ID番号のフィールドを備えた市民システムを維持する 2. ビジネス コードでは、重複する ID 番号が 2 つ書き込まれないようにすることができます (ビジネスでこれを保証できない場合は、データベースの一意のインデックスを使用して制約することができます) 3. 一般的な SQL クエリ ステートメント: SELECT name FROM CUser WHERE id_card = 'XXX' 4. インデックスを作成する
フィールドkの値は重複していないと仮定する クエリプロセス 1. クエリステートメント: 2. クエリプロセス
3. 共通インデックスの場合
4. ユニークインデックスの場合
パフォーマンスの違い 1. パフォーマンスの違い: 非常に小さい 2. InnoDBデータはデータページ単位で読み書きされます。デフォルトは16KBです。 3. レコードを読み取る必要がある場合、レコード自体はディスクから読み取られるのではなく、データ ページ単位で読み取られます。 4. k=5のレコードが見つかった場合、そのレコードが配置されているデータページはすでにメモリ内に存在する。 5. 通常のインデックスでは、ポインタ検索と計算が1回ずつ追加されるだけで済み、CPU消費量は非常に少ない
バッファを変更する 1. データページを更新する必要がある場合、データページがメモリ内にある場合は直接更新されます。 2. データページがメモリ内にない場合、データの一貫性に影響を与えずに
3. 変更バッファは永続的なデータであり、メモリ内にコピーがあり、ディスクにも書き込まれます。 4. ランダムディスク読み取りを減らし、ステートメントの実行速度を向上させるために、最初に更新操作を変更バッファに記録します。 5. さらに、データページをメモリに読み込むには、バッファプールを占有する必要があります。変更バッファを使用すると、メモリの占有を回避し、メモリの使用率を向上させることができます。 6. 変更バッファはバッファプール内のメモリを使用するため、無制限に増やすことはできません。制御パラメータinnodb_change_buffer_max_size # デフォルトは25、最大値は50 mysql> '%innodb_change_buffer_max_size%' のような変数を表示します。 +---------------------------------+-------+ | 変数名 | 値 | +---------------------------------+-------+ | innodb_change_buffer_max_size | 25 | +---------------------------------+-------+ マージ 1. マージ: 変更バッファ内の操作を元のデータページに適用する 2. マージの実行プロセス
3. マージが実行された後、変更バッファに対応するメモリ内のデータ ページとディスク ページは変更されておらず、ダーティ ページになります。
4. トリガータイミング
利用条件 1. 一意のインデックスの場合、すべての更新操作は、まずその操作が一意性制約に違反しているかどうかを判断する必要があります。 2. ユニークインデックスの更新では変更バッファを使用できません。共通インデックスのみが変更バッファを使用できます。
使用シナリオ 1. データ ページがマージされる前に変更バッファーに記録されている変更が多いほど、メリットは大きくなります。 2. 読み取りよりも書き込みが多いビジネスの場合、ページが書き込まれた直後にアクセスされる可能性は極めて低いため、この時点で変更バッファの使用が最も効果的です。
3. ビジネスの更新モードの場合:書き込み後すぐにクエリが実行されます
更新プロセス 挿入(4,400) 対象ページはメモリ内にあります
対象ページがメモリ内にありません 1. ユニークインデックスの場合、データページをメモリに読み込み、競合があるかどうかを判断し、値を挿入する必要があります。
共通インデックスの場合は、変更バッファに更新操作を記録するだけです。
インデックスの選択 1. 共通インデックスとユニークインデックスのクエリパフォーマンスに大きな違いはありません。主な考慮事項は更新パフォーマンスです。共通インデックスを選択することをお勧めします。 2. 変更バッファを閉じることが推奨されるシナリオ
mysql> '%innodb_change_buffering%' のような変数を表示します。 +-------------------------+-------+ | 変数名 | 値 | +-------------------------+-------+ | innodb_change_buffering | すべて | +-------------------------+-------+ # 有効な値(>= 5.5.4) なし / 挿入 / 削除 / 変更 / 削除 / すべて # 有効な値(<= 5.5.3) なし / 挿入 # 変更バッファの前身は挿入バッファであり、挿入操作のみを最適化できます。 バッファの変更 + redolog 更新プロセス k-treeの現在の状態: 対応する場所を見つけた後、k1が配置されているデータページページ1はメモリ内にあり、k2が配置されているデータページページ2はメモリ内にありません。 t(id,k)に値(id1,k1),(id2,k2)を挿入します。 # メモリ: バッファプール # 再ログ:ib_logfileX # データテーブルスペース: t.ibd # システムテーブルスペース: ibdata1 1. ページ1はメモリ内にあるので、メモリを直接更新します 2. ページ2がメモリにない場合は、チェンジャーバッファに記録します。ページ2に(id2,k2)を追加します。 3. 上記の2つのアクションは、REDOLOG(ディスクシーケンシャル書き込み)に含まれます。 4. トランザクションは完了し、更新ステートメントの実行コストは非常に低くなります。
5. トランザクションがコミットされると、変更バッファ操作レコードもREDOログに記録されます。
点線はバックグラウンド操作であり、更新操作の応答時間には影響しません。 読み取りプロセス 前提: 読み取りステートメントは更新ステートメントの直後に実行され、メモリ内のデータはまだ存在し、システム テーブルスペース (ibdata1) および redolog (ib_logfileX) とは関係ありません。 SELECT * FROM t WHERE k IN (k1,k2); 1. ページ 1 を読み取り、メモリから直接返します (この時点では、ページ 1 はまだダーティ ページであり、実際にはディスクに書き込まれていない可能性があります) 2. ページ2を読み取り、ランダムディスク読み取りを通じてデータページをメモリに読み込み、変更バッファ内の操作ログを適用します(マージ)
更新パフォーマンスの向上 1. redolog: ランダムディスク書き込みIO消費を節約します(シーケンシャル書き込み) 2. バッファの変更: ランダムディスク読み取りのIO消費を節約します 参考文献 「MySQL実践45講義」 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
>>: Ubuntu 16.04 に Docker と nvidia-docker をインストールするための詳細なチュートリアル
質問最近、SSH フレームワークを使用して実用的なプロジェクトを完了していたときに、長い間悩まされて...
Neo4j (Nosql の 1 つ) は、高性能なグラフ データベース (分散をサポートしていませ...
この記事は主にPostgreSQLマテリアライズドビューのプロセス分析について紹介します。サンプルコ...
負荷分散とは負荷分散は主に、専用のハードウェア デバイスまたはソフトウェア アルゴリズムによって実現...
Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...
必要:ビジネス要件によると、写真をアップロードできる必要があり、アップロードされた写真はモバイル端末...
ラベル表示モード(重要) divタグとspanタグ1. スタイルはまったく同じですが、ラベルが異なり...
1. 単一マシン環境の構築# 1.1 ダウンロードZookeeper の対応するバージョンをダウンロ...
新しい質問急いで来て、急いで行ってください。 「垂直グリッドとプログレッシブ行間隔 (パート 1)」...
1.サービスコマンドサービスコマンドは実際には/etc/init.dディレクトリに移動し、関連プログ...
使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...
この記事では、オンラインアナウンスのスクロール効果を実現するためのJSの具体的なコードを参考までに共...
MySQL 開発チームは、2019 年 10 月 14 日に MySQL 8.0.18 GA バージ...
なぜ高さを設定できるのでしょうか。<h1 /> などの要素とは異なり、「セミインライン」...
目次実験環境インストールと展開データベースをインストールして設定します (ここでは mariadb ...