MySQL 5.6 での table_open_cache パラメータの最適化と適切な構成の詳細な説明

MySQL 5.6 での table_open_cache パラメータの最適化と適切な構成の詳細な説明

1. はじめに

table_cache は非常に重要な MySQL パフォーマンス パラメータであり、バージョン 5.1.3 以降では table_open_cache と呼ばれます。 table_cache は主にテーブルキャッシュの数を設定するために使用されます。各クライアント接続は少なくとも 1 つのテーブルにアクセスするため、このパラメータの値は max_connections に関連しています。
たとえば、1000 個の接続が並列で実行される場合、少なくとも 1000 × N のテーブル キャッシュが必要です。ここで、N はアプリケーションが実行できるクエリの結合におけるテーブルの最大数です。さらに、一時テーブルとファイル用にいくつかの追加ファイル記述子を予約する必要があります。

2. キャッシュメカニズム

接続がテーブルにアクセスすると、MySQL は現在キャッシュされているテーブルの数をチェックします。テーブルがキャッシュ内で開かれている場合は、クエリを高速化するためにキャッシュ内のテーブルに直接アクセスされます。テーブルがキャッシュされていない場合は、現在のテーブルがキャッシュに追加され、クエリが実行されます。

キャッシュ操作を実行する前に、table_open_cache を使用してキャッシュ テーブルの最大数を制限します。現在キャッシュされているテーブルが table_open_cache に達していない場合は、新しいテーブルが追加されます。この値に達した場合、MySQL は最後のクエリ時間、クエリ レート、およびキャッシュ テーブルのその他のルールに基づいて以前のキャッシュを解放します。 MySQL がテーブルにアクセスするたびに、テーブル バッファに空きがあれば、テーブルが開かれ、そこに配置されるため、テーブルの内容に高速にアクセスできます。

3. 判断方法

ピーク時のステータス値 Open_tables と Opened_tables を確認することで、table_open_cache の値を増やす必要があるかどうかを判断できます。

open_tables が table_open_cache と等しく、opened_tables が増加している場合は、table_open_cache の値を増やす必要があります (上記のステータス値は、SHOW GLOBAL STATUS LIKE 'Open%tables' を使用して取得できます)。

table_open_cache を盲目的に大きな値に設定することはできないことに注意してください。設定値が高すぎると、ファイル記述子が不足し、パフォーマンスが不安定になったり、接続に失敗したりする可能性があります。

開いているテーブル / 開いているテーブル >= 0.85

オープンテーブル / テーブルキャッシュ <= 0.95

4. 提案

最初はよくわからない場合は、MySQL データベースを一定期間本番環境に置き、その後パラメータ値を Opened_tables の値より大きくなるように調整し、比較的負荷が高い極端な状況でも Opened_tables よりわずかに大きい値であることを確認します。
MySQL のデフォルト インストールでは、メモリが 2G 未満のマシンでは table_cache の値は 256 ~ 512 です。マシンに 4G のメモリがある場合、デフォルト値は 2048 です。ただし、マシンのメモリが大きいほど、この値を大きくする必要があるというわけではありません。table_cache を増やすと、MySQL の SQL への応答が速くなるため、必然的にデッド ロックが増え、データベース操作全体の速度が低下し、パフォーマンスに重大な影響を及ぼします。したがって、日常的なメンテナンスの際には、データベースの実際の状況に基づいて判断し、メンテナンスしているデータベースに最適な table_cache 値を見つける必要があります。

mysql>flush tables; open_tables をクリアできます

# service mysqld restart は opened_tables をクリアできます

以下はMySQL 5.6の手順です

table_open_cache はテーブル キャッシュのサイズを指定します。 MySQL がテーブルにアクセスするたびに、テーブル バッファに空きがあれば、テーブルが開かれ、そこに配置されるため、テーブルの内容に高速にアクセスできます。
ピーク時のステータス値 Open_tables と Opened_tables を確認することで、table_open_cache の値を増やす必要があるかどうかを判断できます。
open_tables が table_open_cache と等しく、opened_tables が増加している場合は、table_open_cache の値を増やす必要があります (上記のステータス値は、SHOW GLOBAL STATUS LIKE 'Open%tables' を通じて取得できます)。
table_open_cache を盲目的に大きな値に設定することはできません。値が大きすぎると、シェルのファイル記述子を超えてしまいます (ulimit -n で確認してください)。その結果、ファイル記述子が不足し、パフォーマンスが不安定になったり、接続に失敗したりする可能性があります。

テスト環境: Tencent Cloud CDB、メモリ 4000M、コンソールで table_open_cache=512 を確認し、table_open_cache 設定が適切かどうか、最適化する必要があるかどうかを監視します。

'%table_open_cache%' のような変数を表示します。 

「Open%tables」のようなグローバルステータスを表示します。

open_tables が table_open_cache と等しく、両方とも 512 であることがわかりました。これは、MySQL が新しいテーブルを収容するためにキャッシュされたテーブルを解放していることを示しています。この時点で、table_open_cache の値を増やす必要がある場合があります。4G メモリを搭載したマシンの場合は、2048 に設定することをお勧めします。

より適切な値:

開いているテーブル / 開いているテーブル >= 0.85
オープンテーブル / テーブルオープンキャッシュ <= 0.95

このパラメータについて確信が持てない場合は、非常に保守的な設定の提案があります。MySQL データベースを本番環境に一定期間配置して試用し、パラメータ値を Opened_tables の値よりも大きくなるように調整し、比較的負荷が高い極端な状況でも Opened_tables よりもわずかに大きいことを確認します。

以下もご興味があるかもしれません:
  • MySQL パラメータ関連の概念とクエリ変更方法
  • Python 接続 MySQL メソッドと共通パラメータ
  • pyMySQL SQL ステートメントのパラメータ渡しの問題、単一パラメータまたは複数パラメータの説明
  • Python MySQLのパラメータ化の説明
  • SQL 文を実行するときの Python MySQLdb パラメータ渡し方法
  • Python MySQL の日付時刻の書式設定をパラメータ操作として
  • MySql ストアド プロシージャ パラメータの初歩的な使用法の詳細な説明
  • MySQLのinnodb_data_file_pathパラメータを変更する際の注意事項
  • MYSQL設定パラメータの最適化の詳細な説明
  • MySQL パフォーマンスの包括的な最適化方法リファレンス、CPU、ファイルシステムの選択から mysql.cnf パラメータの最適化まで
  • MySQLのパラメータについてお話しましょう

<<:  Kubernetes オブジェクトボリュームの詳細な使用方法

>>:  Mac VMware Fusion CentOS7 静的 IP 構成チュートリアル図

推薦する

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

WMLとは何ですか?

WML (ワイヤレス マークアップ言語)。これは HTML から派生したマークアップ言語ですが、W...

Angularコンポーネントライフサイクルの詳細説明(I)

目次概要1. フックの呼び出し順序2. onChangesフック3. 変更検出メカニズムとDoChe...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

VMware ESXi のインストールと使用記録(ダウンロード付き)

目次1. ESXiをインストールする2. ESXiをセットアップする3. ESXiを起動するESXi...

Ubuntu 16.04 64ビット版を3つのステップで32ビットプログラムと互換性を持たせる

ステップ1: システムのアーキテクチャを確認する dpkg --print-architecture...

HTML における br と br/ の違い

スタックフローからの回答:単に<br>だけで十分です。その他の形式は、XHTML との互...

Dockerは終了状態で起動します

docker run後、ステータスは常にExitedになります解決:パラメータを追加: -it do...

JavaScript インタビュー: 配列の平坦化メソッドを実装する方法

目次1 配列のフラット化とは何ですか? 2 JS標準ライブラリの配列フラット化メソッド3 フラットメ...

4 つの主要な SQL ランキング関数 ROW_NUMBER、RANK、DENSE_RANK、NTILE の使用方法の紹介

1. ROW_NUMBER()定義: ROW_NUMBER() 関数は、select によってクエリ...

VMwareワークステーションとデバイス/資格情報の非互換性によって発生する起動エラーについて

VMware Workstationsが仮想マシンエラーを起動する エラー レポートのリンク htt...

MySQL カーソルの定義と使用法

カーソルの作成まず、MySql でデータ テーブルを作成します。 存在しない場合はテーブルを作成 `...

MySQL 外部キー制約の例の説明

MySQL の外部キー制約は、2 つのテーブル間のリンクを確立するために使用されます。 1 つのテー...