逐語大きな柱 https://www.dazhuanlan.com/2019/08/26/5d634d54a761b/
InnoDBは、ディスクベースのストレージであり、そのレコードは仕方のページで管理されています。
データベースシステムにおいて、プールの技術によって典型的にCPUとディスク速度の速度との間の隙間、ディスクベースのデータベースシステムは、データベースの全体的なパフォーマンスを向上させるためです。プールは、データベースのパフォーマンスに遅いディスク速度の影響を補償するために、単にメモリ速度によってメモリ領域です。
データベースページで読出し動作を、ディスクから読み出された第1ページは、バッファプール、バッファプールの「FIX」ページとして知られるプロセスに格納されています。あなたが同じページを読んで、次回は、バッファー・プール内のページは、バッファプールた場合、ページは直接ページを読んヒットバッファプール内にあると呼ばれるかどうかを判断するために限定されています。それ以外の場合は、ディスク上のページをお読みください。
局所性の原則:データが使用されている場合、その付近のデータも、多くの場合、すぐに使用されています
ディスク先読み:ディスクのアクセス速度は、多くの場合、百のサブ分割メインメモリであり、ディスクI / Oを最小限に抑えるために、効率を向上させるためになります この目的のために、ディスクの読み取り需要は、多くの場合、重要ではないが、それぞれが、それは順次メモリに読み戻す、ディスクは、この位置からのデータの長さを開始します1バイトのみを必要とする場合でも、先読みします
ページ内のデータにアクセスする必要が、それは我々が唯一のレコードのページにアクセスする必要がある場合でも、それはだということを意味し、メモリにロードされた全てのページの完全なデータを置く際に、クライアントの要求を処理するInnoDBストレージエンジンあなたは最初にメモリにページ全体のデータをロードする必要があります。
すべてのページにないデータベース・ページ上の変更操作は、バッファプール内の最初のページには、変更した後、ディスクにフラッシュ特定の周波数で、それはページがバッファー・プールからディスク操作にフラッシュされることに留意すべきですこれは、変更が発生したときにトリガが、チェックポイントと呼ばれるメカニズムを介してデータベースの全体的なパフォーマンスを向上させるためであると同じ、ディスクへ更新します。
要約すると、バッファプールの大きさは、直接データベースの全体的な性能に影響を与えます。InnoDBのバッファプールの設定パラメータをすることができinnodb_buffer_pool_size来设置
mysql> show variables like 'innodb_buffer_pool_size'G
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_size
Value: 134217728
1 row in set (0.01 sec)
キャッシュページのデータ・タイプのプール:インデックス・ページ、データページ、ページはアンドゥを使用して、バッファ(挿入バッファ)を挿入し、適応ハッシュインデックス(アダプティブハッシュインデックス)、InnoDBは(情報をロックする)保存されたロック情報、データ・ディクショナリ情報(データdirctionary)などが挙げられます。データページとインデックス・ページは、バッファプールの大部分を占めるのみ
InnoDBのバッファプールは、各ページがバッファプールインスタンスの異なる断片にハッシュに基づいて評価され、そうすることの利点は、データベースの並行処理の増加、データベース内のリソースの競合を削減することである、複数のインスタンスを可能にする、次のことが可能innodb_buffer_pool_instances
に構成され
mysql> show variables like 'innodb_buffer_pool_instances'G
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_instances
Value: 1
1 row in set (0.00 sec)
また、使用することができshow engine innodb statusG
、バッファプールを観察するためのコマンドを
ディスク上のバッファプールのデフォルトのページ・キャッシュ・サイズとデフォルトのページサイズが同じで、16キロバイトです。より良いバッファー・プールでこれらのキャッシュされたページを管理するために、各ページのInnoDBのバッファは、制御情報は、バッファー・プール内のスペースが属するページテーブルの数、ページ数、キャッシュページアドレスを含み、いくつかの制御情報を作成し、など、リストのノード情報、情報とロックLSN情報の一部、
ページキャッシュメモリのサイズに対応した各制御情報がバッファプールの前部に配置される、同じであり、それがバックキャッシュページバッファプールに格納されています。
バッファプールのキャッシュデータは、MySQLサーバの通常80%のデータ・ディクショナリ・キャッシュは、物理メモリバッファプールに割り当てられますページキャッシュ、変更バッファを備え、
バッファー・プール、変更バッファ、アダプティブハッシュインデックスと四つの部分のログバッファを含む、InnoDBのメモリ構造。観点から、メモリ、変更バッファおよびアダプティブハッシュインデックスは、メモリ占有は、独立したバッファー・プールによって占めバッファー・プール、ログバッファメモリに属している場合
LRUリスト、空きリスト和フラッシュ一覧
フリーリストレコードバッファプールキャッシュページについては無料です。
リストフラッシュページバッファプールがあるキャッシュ記録するために使用汚いページを
ダーティページ我々は、ディスク上のページのバッファプールキャッシュ内のデータ、およびそのページを変更し、キャッシュページもダーティページ(ダーティページ)として知られているので、それは、矛盾している場合。変更はすぐにパフォーマンスに同期して発生した場合、それは真剣に、ディスク上の対応するページのプロセスに影響を与えます。だから、キャッシュ・ページがディスクにフラッシュする必要があるリストを記録する必要があります
LRUリストのバッファー・プール・サイズが限られている、フリーリストは、余分な空きバッファページを持っていない場合は、無限に増殖することができない、あなたは、新しいページを追加し、バッファプールから削除いくつかの古いキャッシュされたページを配置する必要があります。プールは、もはや自由にキャッシュされたページでない場合、我々は、最近使用されたページのキャッシュの一部を排除する必要があります。LRUリストは最小の原則に従って使用され、最近LRUリストの末尾には、最低使用キャッシュされたページであるように、我々はページにアクセスする必要がある場合、キャッシュページを排除LRUリストの先頭に調整したページバッファを置くために使用されます
前の読書
I / Oの最適化でありInnoDBはプリフェッチ要求は、I /リクエストO、それは非同期ページのプール以前にフェッチされた複数のバッファリングされます、これらのページがすぐに必要と予想され、プリフェッチのより重要な特徴の一つでありますこれらの要求は、すべてのページの範囲内に組み込まれました。
要求されたデータが、要求キューに、ファイル・システムへの要求が読み込まれるデータベース、抽出されたデータ、関連するプロセスから除去は、関連データ領域(メモリ、ディスク)読取データニーズに応じに、キューの読み出し要求を要求します、応答キューに、データベース内の最後のデータが処理を完了するために応答キュー、データ読み出し動作から削除されます。次いで、プロセスは、(データベースがフルテーブルスキャンがある場合、データは、要求キューを占有するリード要求)データに続くデータを読み出すか否かが判定されるリクエストキューの処理を継続要求いくつかの隣接し、その後、それ自体の処理量IO帯域幅システムによれば先読み、読み取り要求は、読み出し応答キューの複数に、ワンタイムデータをマージされ、データベースは除去されます。(したがって、物理的読み出し動作、マルチページデータの読み出し)
I / O性能を向上させるためのInnoDB 2つの先読みアルゴリズム:線形プリフェッチ(線形先読み)、及びランダム先読み(randomreadアヘッド)は、バッファプールに次の進歩を読み取るために線形先読み領域に焦点を当て、ランダムな先読みは、事前にページ読み込みバッファプールの残りの部分に現在の領域に焦点を当てます。
リニア先読み
InnoDBのパラメータinnodb_read_ahead_threshold
トリガ時間InnoDBは先行動作制御をお読みください。ページの領域を順次パラメータを超えるか、または変数に等しく、非同期InnoDBは領域内の次のバッファプールを読み取り、読み取られた場合、innodb_read_ahead_threshold
0〜64の任意の値に設定することができ、デフォルト値は、56であります高い値、より厳しいチェックアクセスモード。
mysql> show variables like 'innodb_read_ahead_threshold';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| innodb_read_ahead_threshold | 56 |
+-----------------------------+-------+
1 row in set (0.03 sec)
InnoDBの場合にのみ、次のメモリ領域を読み取るリニア先読み要求をトリガするために、現在のページ領域56へのアクセス。この変数が存在しない場合には、ときエリアの最後のページへのアクセスを、InnoDBは次の領域がバッファプールに配置するかどうかを決定します。
ランダム先読み
ページのいくつかの同じ領域がバッファプールで見つかった場合は、InnoDBは一緒に読んバッファプール内の残りのページの領域になります。InnoDBのパラメータはinnodb_random_read_ahead
、ランダムなプリフェッチの開度を制御します。
mysql> show variables like 'innodb_random_read_ahead';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_random_read_ahead | OFF |
+--------------------------+-------+
1 row in set (0.04 sec)
InnoDBのモニター先読み
することによりshow engine innodb status;
先読み情報を監視
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
よるInnodb_buffer_pool_read_ahead
とInnodb_buffer_pool_read_ahead_evicted
先読みアルゴリズムの有効性を評価
mysql> show global status like '%read_ahead%';
+---------------------------------------+--------+
| Variable_name | Value |
+---------------------------------------+--------+
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 352999 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
+---------------------------------------+--------+
3 rows in set (0.07 sec)
MySQLのバッファプールの汚染
バッチに1つのSQL文は、大量のデータをスキャンすると、それがスワップアウトされるホットデータが多数で、その結果、バッファプールからスワップアウトされているすべてのページにつながる可能性があり、MySQLの性能が急激に減少し、これは、バッファー・プールの汚染と呼ばれています。
テーブル内のレコードの非常に大きな数は、その後、表がページの特に多数を占めることになる場合は、表の全表スキャンを実行するときも、そのバッファー・プールを意味バッファー・プールにロード多数のページになりますすべてのページを一度に交換され、その後、他のクエリは一度荘の実装でバッファプールの操作にディスクからロードされ実行されました。全表スキャンを実行するために、このようなステートメントの頻度は高くないが、それぞれの実行が大幅にキャッシュヒット率を減少させ、真剣にバッファー・プールに関連するその他のお問い合わせの使用に影響を与えるバッファプール、キャッシュされたページを置き換える必要があります。
LRUアルゴリズム
前の説明によると、ページバッファは、このようにバッファプールの効率に影響を与える、プールからフラッシュされる可能性があり、特定のSQL操作に知ることができます。たとえば、インデックスまたはデータのスキャン動作として、これらの操作は、すべてのページでも、テーブル内の多くのページにアクセスする必要があり、これらのページは、一般的にのみ有効ホットデータでないクエリでの動作のために必要とされます。ヘッダはLRUリストに配置されているページは、その後、非常に熱いLRUリンクリストからデータ・ページを削除する必要があるかもしれませんし、次のページが読み込まれる場合は、InnoDBは再びディスクにアクセスする必要があります。
したがって、InnoDBのバッファプールからなる改善のためのLRUアルゴリズムLRUリストは、中間位置に加えました。新しいページは、最新のアクセスページものの、直接ではなく、リストの先頭にLURに、読んでますが、LRUリストに中間位置を配置します。
リストに新しいページが最も活発なホットデータがそうであるように、リストが新しいリストを呼ばれる前に、古いリストと呼ばれる中間点の後にリストにInnoDB内で、あなたは簡単に理解することができます。
innodb_old_blocks_pct
新旧の分布を制御する、デフォルト値は37です
mysql> show variables like 'innodb_old_blocks_pct'G
*************************** 1. row ***************************
Variable_name: innodb_old_blocks_pct
Value: 37
1 row in set (0.01 sec)
LRUリストの後に古いものと新しい、InnoDBのロジック処理に次に従って
- ディスク上のページがキャッシュページで初めてバッファー・プールにロードされると、ページキャッシュは、リストの古い頭を入れられます。これは、徐々に、より頻繁にキャッシュされたページのリストを使用している若者に影響を与えずに、古いリストからページを訪問し、フォローアップしませんでした先読みバッファー・プールのために追放されます。
- 古いリストのキャッシュページの時に記録は、アクセスタイムダウンその対応する制御ブロックに初めてアクセスされる場合、特定の時間間隔内の最初のアクセスの後続のアクセス時間の時間、そのページには、リストの新しいヘッドに古いから移動、またはリストの先頭の新しいリストに移動されることはありません
全表スキャンは、その実行頻度が非常に低いという特徴を持っており、全表スキャンの過程で、ページは多くのレコードを持っている場合でも、つまり、多くの訪問には時間がかかり、このページがあるので非常に少ないです。
InnoDBのinnodb_old_blocks_time
制御ページの読み取りパラメータを配置する半ばの前にLRUリストのホットエンドに追加どのくらい待つことです。1000ミリ秒のデフォルト値
mysql> show variables like 'innodb_old_blocks_time'G
*************************** 1. row ***************************
Variable_name: innodb_old_blocks_time
Value: 1000
1 row in set (0.00 sec)
ページ管理とLRUリストが読み込まれていますが、データベースがちょうど始まったとき、LRUリストが空である、すなわち任意のページせず、その後、ページがフリーリストに格納されています。場合は、リストのLRU側を排除LRUアルゴリズムに従って、フリーリストからLRUリストに入れた場合、または最初の使用可能な空きページのフリーリストから、ページが削除されるバッファプールから必要なページ、ページ、新しいスライスにメモリページ。ため、新しいパーツのLRU部分からの古いページは、その時に発生する操作は、ページが若い作られたといい、されている場合innodb_old_blocks_time
、古いから若い行われていないページと呼ばれるページごとに提供リードは新しいセクションの操作部を移動させること。
それは古いデータ、新しいリストであるか、リストへのアクセスがない場合は、ページが解消されるように、最終的には、リストの最後に移動するかどうかを、データベース内部のバッファプールで。
ショーエンジンInnoDBのステータス
あなたは使用することができますshow engine innodb statusG
LRUリスト及びフリーリストの使い方や操作の状態を観察するためのコマンドを
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 3807133
Buffer pool size 8192
Free buffers 1024
Database pages 7141
Old database pages 2616
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 127464, not young 10579743
0.00 youngs/s, 0.00 non-youngs/s
Pages read 393131, created 205050, written 19241821
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 7141, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
Total large memory allocated 137428992
InnoDBは割り当てられたメモリサイズ
Dictionary memory allocated 3807133
InnoDBデータ辞書メモリサイズに割り当てられました
Buffer pool size 8192
innodb_buffer_poolサイズ(ページ)
Free buffers 1024
LRUリストinnodb_buffer_pool空きページ数
Database pages 7141
LRUリストinnodb_buffer_poolページのnon-freeの数
Old database pages 2616
ページ数は古いのサブリストをinnodb_buffer_pool
Modified db pages 0
innodb_buffer_pool内のダーティページの数
Pending reads
そして、Pending writes
保留中の表示は、読み込みと書き込み
Buffer pool hit rate 1000 / 1000...
通常、バッファプールのヒット率はInnoDBを確保するために示し以上1000分の998という。ない場合は、バッファプールのサイズを大きくすることを検討して、あなたのクエリを最適化
Pages read ahead 0.00/s
これは、(リード)第2の直線の数が先読み示します。
evicted without access
これは、毎秒読んページを表示します
Random read ahead 0.00/s
これは、毎秒ランダムな先読みの数を示します。
バッファー・プール・サイズは、8191ページの合計、8191 * 16Kバッファー・プール・スペースの合計、フリーバッファは、現在のページフリーリストの数を表します。データベースのページはLRUリストのページ数を示します。ページバッファプールも挿入バッファ、適応ハッシュインデックスに割り当てることができますので、無料のバッファ+データベースページが等しくないバッファプールのサイズ、ロック情報は(情報をロックする)場合があり、データ・ディクショナリ情報、
バッファプールの設定
- innodb_buffer_pool_size:この値は、InnoDBのバッファプールのセットの合計サイズです。
- innodb_buffer_pool_chunk_size:InnoDBのバッファプールの実行ユニットのチャンクサイズの大きさ。これは、この設定に応じて最善であるかを判断するための関係の中にあります
innodb_buffer_pool_size=innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances*N(N>=1)
。 - innodb_buffer_pool_instances:InnoDBのバッファプールは、インスタンスの数を設定し、各インスタンスは、それ自身の別々のリスト管理バッファプールを有します。
- innodb_old_blocks_pct:デフォルト値は、我々は3/8の位置と呼んだものである、100最大、37である、あなたが自分で設定することができ、InnoDBのバッファプールの中間位置をデフォルト。
- innodb_old_blocks_time:時の位置リストの内部に挿入バッファ・プールに格納された設定の保持時間データは変更されません。
- innodb_read_ahead_threshold:MySQLのパラメータ制御ときプリフェッチするデータ・ページinnodb_read_ahead_threshold内部に格納された値よりも大きいバッファプール頻出値場合は、データの感度は、InnoDBが非同期プリフェッチを開始すると、MySQLは先読みするデータを制御することができます操作;
- innodb_random_read_ahead:デフォルトはDisabled、先読みを制御するパラメータは、それが読むために開きますが、線形事前ランダム先読みを使用しないでください。
- innodb_adaptive_flushingは:これは、自分の意思決定をロードするのMySQLに基づいて、動的な適応は、ディスクへのダーティページを更新するかどうかを指定します。しかし、まだMySQLが自分自身を管理するために聞かせて、設定しないようにしよう。
- innodb_adaptive_flushing_lwm:閉じるadaptive_flushing語は、REDOログの使用率の最も低い割合をマーキングラインために有用であろう、この値に達したとき、それはダーティページが更新されます、デフォルトは10です。
- innodb_flush_neighbors:、1のデフォルト値を更新するために一緒にダーティデータページと同じエリア内のバッファプール、ダーティダーティデータページをリフレッシュするかどうかをコントロール。
- innodb_flushing_avg_loops:バッファー・プール、デフォルト値は30である前に、InnoDBはInnoDBが数回反復回数の状態のスナップショットをすすぐために保存し、それを増加させ、それが遅くなるすすぎます。その後減少し、周波数が高くなるすすぎます。
- innodb_lru_scan_depth:制御パラメータLRUアルゴリズムは、バックグラウンド・プロセスのpage_cleanerバッファー・プールのリフレッシュの場所ダーティ・ページを制御するために使用されます。
- innodb_max_dirty_pages_pct:InnoDBのバッファプールパラメータは、ダーティデータの割合がこの値を超えるせずにデータを更新します。
- innodb_max_dirty_pages_pct_lwm:InnoDBは自動的にバックグラウンドジョブを自動的に設定値innodb_max_dirty_pages_pct_lwmに到達する時間の占有率でダーティページバッファ・プール、それは自動的にダーティページバッファプールをクリアし、バッファー・プールからのダーティデータをクリアし維持します。
- innodb_buffer_pool_filename:文書名を指定します。
- innodb_buffer_pool_dump_at_shutdown:サーバーを再起動した後に回避するために、InnoDBのバッファプールの状態の現在の設定を保持するかどうか、だけでなく、長いウォームアップ時間を通して、
- innodb_buffer_pool_load_at_startup:このパラメータは、データベースは自動的に、ウォームアップを再開バッファプールの再起動前に保存された情報を読み取ります後、スタートを指定します。
- データベースはにもたらしてきたときに我々が以前に指定し、すぐに復元を指定することができることを忘れ、innodb_buffer_pool_dump_nowとinnodb_buffer_pool_load_now。
- innodb_buffer_pool_dump_pct:バッファプールの回復についての設定どのくらいのデータ。
- innodb_buffer_pool_load_abort:終了バッファー・プールを使用すると、ロード操作を指定することができ、復元します。
参考資料
「MySQLのInnoDBストレージエンジン技術インサイダー第2版」
「MySQLは、それがどのように働くかある:茎から理解MySQLの。」
https://www.cnblogs.com/geaozhang/p/7397699.html
https://mp.weixin.qq.com/s/ZPXcsogmO9BkKMKNLQxNLA
https://mp.weixin.qq.com/s/nA6UHBh87U774vu4VvGhyw