MySQL の最適化: InnoDB の最適化

MySQL の最適化: InnoDB の最適化

勉強の計画は簡単に中断され、継続するのが困難です。先日、社内で事業の方向性を調整するための会議があり、NodeJS を学ぶことが推奨されました。以前から NodeJS については少し知っていましたが、深く勉強していませんでした。 Node の構文は、基本的にクライアント側の Js の構文と同じです。過去 6 か月間、クライアント側の開発はほとんど行われていません。私は JS については十分な知識を持っていますが、今のところこの分野についてはよくわかっていません。知識は使われたり、失われたりするようです。頻繁に使われなければ、すぐに忘れられてしまいます。そこで、JS の関連知識をもう一度見直しました。 Node のサーバーとソケットについて学びました。 MySQL の計画は棚上げになりました。日曜日は食べて、飲んで、寝ました。午前中は怠けていたので、やっと午後まで頑張れました。では、さっそくMySQLの最適化シリーズを続けていきましょう。今回はInnoDBの最適化項目を見ていきましょう。

InnoDB のプライマリ インデックスはクラスター化インデックスであり、インデックスとデータは同じテーブルスペースを共有します。 InnoDB の場合、データはインデックスであり、インデックスはデータです。 InnoDB のキャッシュ メカニズムと MyISAM の最大の違いは、InnoDB はインデックスをキャッシュするだけでなく、データもキャッシュすることです。

1. InnoDB キャッシュプール

InnoDB バッファ プールは、InnoDB のパフォーマンスを向上させる鍵です。データ、インデックス、さらにはその他の管理データ (メタデータ、行レベルのロック) をキャッシュできます。関連するパラメータ オプションを表示するには、「innodb%pool%」のような show variables を使用できます。

mysql> 'innodb%pool%' のような変数を表示します。
+-------------------------------------+----------------+
| 変数名 | 値 |
+-------------------------------------+----------------+
| innodb_additional_mem_pool_size | 8388608 |
| innodb_buffer_pool_dump_at_shutdown | オフ |
| innodb_buffer_pool_dump_now | オフ |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 8 |
| innodb_buffer_pool_load_abort | オフ |
| innodb_buffer_pool_load_at_startup | オフ |
| innodb_buffer_pool_load_now | オフ |
| innodb_buffer_pool_size | 134217728 |
+-------------------------------------+----------------+

innodb_バッファプールサイズ

innodb_buffer_pool_size は、InnoDB バッファプール (InnoDBBufferPool) のサイズを設定するために使用されます。デフォルト値は 128M です。InnoDB バッファプールのサイズは、InnoDB の全体的なパフォーマンスに大きな影響を与えます。現在の MySQL サーバーが MySQL サービス専用である場合は、このパラメータのサイズを可能な限り増やすことができます。

innodb_バッファプールインスタンス

innodb_buffer_pool_instance のデフォルト値は 1 です。これは、InnoDB バッファ プールが 1 つの領域に分割されていることを意味します。このパラメータ値を適切に増やすと、InnoDB の同時実行パフォーマンスが向上します。

innodb_追加メモリプールサイズ

InnoDB がデータ ディクショナリやその他の内部データを格納するために使用するキャッシュ サイズを指定します。デフォルト値は 2M です。InnoDB テーブルの数が多いほど、このパラメータを大きくする必要があります。

2. InnoDBキャッシュプールの内部構造

InnoDB は、データとインデックスをキャッシュするためのバッファ プールをメモリ内に保持します。キャッシュ プールは、非常に長いリンク リストと考えることができます。リンク リストは 2 つのサブリストに分かれています。1 つのサブリストには、長い間アクセスされていないデータ ページである古いページ データが保存されます。もう 1 つのサブリストには、最近アクセスされたデータ ページである新しいページ データが保存されます。デフォルトでは、古いページはリンク リスト全体のサイズの 37% を占めており、これは innodb_old_blocks_pct パラメータを通じて確認できます。

mysql> 'innodb_old_blocks%' のような変数を表示します。
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| innodb_old_blocks_pct | 37 |
| innodb_old_blocks_time | 1000 |
+------------------------+-------+

古いページと新しいページの交差点は中点と呼ばれます。

ユーザーがデータにアクセスすると、InnoDB はまず InnoDB キャッシュ内のデータを検索します。キャッシュ プールにデータがない場合、InnoDB はハード ディスク上のデータを InnoDB キャッシュ プールに挿入します。キャッシュ プールがいっぱいの場合、LRU アルゴリズムを使用して期限切れの古いデータをクリアします。

3. InnoDB キャッシュ プールを予熱します。

MySQL サーバーが起動されてから一定期間が経過すると、InnoDB は頻繁にアクセスされるデータ (業務データ、管理データ) を InnoDB キャッシュに格納します。つまり、InnoDB キャッシュ プールには、頻繁にアクセスする必要があるデータ (ホット データと呼ばれる) が格納されます。 InnoDB キャッシュ プールのサイズが数十 GB または数百 GB の場合、MySQL を再起動すると、以前の InnoDB キャッシュ プールのホット データを InnoDB キャッシュ プールにどのようにロードしますか?

InnoDB キャッシュ プールを InnoDB 自体だけで予熱すると、時間がかかります。業務が忙しいシステムでは、長時間のダウンタイムは重大な運用上の事故であり、許容できません。幸いなことに、MySQL バージョン 5.6 では、サービスをシャットダウンするときにホット データをハード ディスクに保存することがサポートされています。MySQL を再起動すると、ハード ディスク上のホット データが最初に InnoDB キャッシュにロードされます。これにより、ウォームアップ時間が短縮され、業務が忙しく同時実行性が高い場合に効率が向上します。

mysql> '%innodb%pool%' のような変数を表示します。
+-------------------------------------+----------------+
| 変数名 | 値 |
+-------------------------------------+----------------+
| innodb_additional_mem_pool_size | 8388608 |
| innodb_buffer_pool_dump_at_shutdown | オフ |
| innodb_buffer_pool_dump_now | オフ |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 8 |
| innodb_buffer_pool_load_abort | オフ |
| innodb_buffer_pool_load_at_startup | オフ |
| innodb_buffer_pool_load_now | オフ |
| innodb_buffer_pool_size | 134217728 |
+-------------------------------------+----------------+

シャットダウン時の innodb_buffer_pool_dump

デフォルトはオフです。パラメータをオンにして MySQL サービスを停止すると、InnoDB キャッシュ内のホット データがハードディスクに保存されます。

起動時に innodb_buffer_pool_load を実行する

デフォルトはオフです。このパラメータをオンにすると、MySQL サービスが起動したときに、MySQL はローカル ハード ディスク上のホット データを InnoDB キャッシュ プールにロードします。

innodb_buffer_pool_dump_now

このパラメータはデフォルトでは無効になっています。このパラメータを有効にすると、MySQL サービスが停止したときに、InnoDB キャッシュ プール内のホット データが手動でローカル ハード ディスクに保存されます。

innodb_buffer_pool_load_now

デフォルト設定はオフです。このパラメータをオンにすると、MySQL サービスが起動したときに、ローカル ハード ディスク上のデータが InnoDB キャッシュ プールに手動でロードされます。

innodb_buffer_pool_ファイル名

InnoDB の予熱機能が有効になっている場合、MySQL サービスが停止すると、MySQL は InnoDB キャッシュ プール内のホット データをデータベース ルート ディレクトリに保存します。デフォルトのファイル名はこのパラメータの値です。

InnoDB キャッシュを有効にした後、次のコマンドを使用して、現在の InnoDB キャッシュ プールの予熱のステータス情報を表示できます。

'innodb_buffer%' のようなステータスを表示します。
+---------------------------------------+--------------+
| 変数名 | 値 |
+---------------------------------------+--------------+
| Innodb_buffer_pool_dump_status | 開始されていません |
| Innodb_buffer_pool_load_status | 開始されていません |
| Innodb_buffer_pool_pages_data | 218 |
| Innodb_buffer_pool_bytes_data | 3571712 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 1 |
| Innodb_buffer_pool_pages_free | 7973 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 8191 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 1497 |
| Innodb_buffer_pool_reads | 219 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 1 |
+---------------------------------------+--------------+

ここの英語は比較的簡単なので説明しません。

4. InnoDBリアルタイム監視

mysql> show engine innodb status\G

以下もご興味があるかもしれません:
  • Mysql5.5 InnoDB ストレージ エンジンの構成と最適化
  • MySQL を最適化するために Innodb データ ページ サイズを変更する方法
  • MySQL の InnoDB におけるカウント最適化の問題の共有
  • MySql 最適化のための my.ini 中国語構成スキームの詳細な説明: InnoDB、4GB メモリ、および複数のクエリ
  • MySQL InnoDB MRR 最適化ガイド

<<:  Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

>>:  JavaScript スクリプトが実行されるタイミングの詳細な説明

推薦する

システム エラー 1067 のため、MySQL 5.6 解凍バージョン サービスを開始できません

今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

docker compose helloworld を使い始めるための詳細なプロセス

前提条件Compose は、Docker コンテナをオーケストレーションするためのツールです。Doc...

面接官はReactのライフサイクルについてよく質問します

ReactライフサイクルReactのライフサイクルを理解するのに役立つ2つの図React ライフサイ...

XML構文の詳細な説明

1. 文書化ルール1. 大文字と小文字が区別されます。 2. 属性値は引用符(一重引用符または二重引...

Centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar の簡単な分析

Baiduクラウドディスク:リンク: https://pan.baidu.com/s/1hv5rUW...

フレックスレイアウトが子要素によって引き伸ばされたときに、コンテンツをコンテナ内に保持する方法

モバイル デバイスでは、フレックス レイアウトが非常に便利です。デバイスの幅に応じてコンテナーの幅を...

JSはショッピングカート内の商品の合計金額の計算を実現します

JSはショッピングカート内の商品の合計金額を計算して参考とします。具体的な内容は以下のとおりです。質...

JavaScript ドラッグタイム ドラッグケースの詳細な説明

目次DragEvent インターフェースデータ転送インターフェースの概要DataTransfer の...

Linux サーバーのグラフィック カードのクラッシュの解決策

ログインインターフェースの解像度が特に大きい場合、グラフィカルインターフェース全体が特に大きくなり、...

Vue バックエンド管理システムのページング機能の実装例

この記事では、主に Vue バックグラウンド管理システムのページング機能の実装を紹介し、次のように共...

CentOS 7 パスワードを忘れた場合の解決プロセス図

必要Windows システムでも Linux システムでも、さまざまな理由でパスワードを忘れてしまう...

Zabbix の psk 暗号化と zabbix_get 値の組み合わせ

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbix...

ディスクを破壊せずに Linux で dd コマンドを使用する方法

故障したストレージ ドライブからデータを救出する場合でも、アーカイブをリモート ストレージにバックア...

データベースの水平セグメンテーションを実装するための2つのアイデア

導入インターネット アプリケーションの普及に伴い、膨大なデータの保存とアクセスがシステム設計における...