シナリオ 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 をインストールするための詳細なチュートリアル
目次プロジェクトにおける一般的な支払い方法Alipay決済微信ペイプロジェクトにおける一般的な支払い...
序文ご存知のとおり、「CSS で要素を垂直方向に中央揃えするにはどうすればよいか」という質問は、すで...
アプリケーション例ウェブサイト http://www.uhuigou.net画像の動的読み込みは目新...
序文最近、私はクライアントのサーバー構成を支援しており、Nginx 構成ファイルを頻繁に変更していま...
目次1. usrディレクトリにHadoopディレクトリを作成し、インストールパッケージをそのディレク...
1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...
フォームを作成するときに、送信ボタンとリセットボタンを配置することがよくあります。ページの外観を考慮...
導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...
この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...
JavaScriptでのランダムコードの生成と検証は参考までに。具体的な内容は以下のとおりです。イベ...
プロシージャ sp_name を削除します//これまで、MYSQL 構文の基礎知識について説明して...
この記事では、例を使用して、MySQL ストアド プロシージャの概念、原則、および一般的な使用法につ...
この記事は参考までにmysql 8.0.19 winx64.zipのインストールチュートリアルを記録...
MySQL 5.7 より前のバージョンのパスワードを変更する方法:方法1: SET PASSWORD...
まず、github から nacos の圧縮パッケージをダウンロードします: https://git...