32 GBのRAMを備え、40個のMyISAMテーブルを保持する8コアのMySQLサーバーがあります(合計:〜4GBのデータ)。データベースのサイズは使用可能なメモリの数分の1なので、サーバーのリソースを最大限に活用するにはどうすればよいですか?
My.cnfでどの設定を構成する必要がありますか?
データ+インデックスを強制的にメモリに保持できますか?
MySQLは、MySQLのメモリのインデックスのみをキャッシュし、データはキャッシュしません。データは、基盤となるオペレーティングシステムのファイルシステムキャッシュによってのみキャッシュされます。 my.cnfで調整する最も重要な値はkey_buffer_size
で、これはMyISAMがインデックスをキャッシュするためのメモリを割り当てます。
ただし、MyISAMテーブルを使用する特定の理由がない限り、それらのテーブルをInnoDBに変換する必要があります。この時代では、MyISAMを使用する理由は少なくありません。MyISAMは、同時実行性、データの整合性、またはクラッシュリカバリに適していません。
InnoDBに切り替える場合、最も重要な設定は、データページとインデックスをキャッシュする内部メモリキャッシュであるinnodb_buffer_pool_size
です。考慮すべき他の事柄はinnodb_log_file_size
であり、必ずinnodb_file_per_table=1
を設定してください。 4GBのデータとインデックスの場合、innodb_buffer_pool_size=4G
の設定は妥当です。並行性の高い環境で実行している場合は、innodb_thread_concurrency
の値を試すことができます。私の推奨はinnodb_thread_concurrency = 0から始めることですが、ワークロードとMySQLのバージョンによっては、4〜8のいずれかに明示的に設定する必要があるかもしれません。
MyISAMのデータをキャッシュできないため、InnoDBを使用する必要があるという点でアーロン(+1)に同意します。
ここにあなたが気にする必要のある設定があります
innodb_buffer_pool_size :4GBのデータがあり、innodb_buffer_pool_sizeを4Gに設定するのが適切ですが、innodb_buffer_pool_sizeを8Gに設定することをお勧めします。どうして ?バルク操作が発生した場合、基本的にはinnodbバッファープールのコンテンツの一部またはすべてを消去します。
innodb_log_file_size :innodb_log_file_sizeについては、最大値(2047M)に設定する必要があります。 ログファイルのデフォルトサイズが5Mの場合、サイズを変更する必要があります 。
innodb_file_per_table :必ず、これを設定してください。そうしないと、ibdata1と呼ばれるInnoDBシステムファイルが制御不能に大きくなります。 ibdata1内に既にロードされているテーブルがある場合は、InnoDBインフラストラクチャをクリーンアップする必要があります ibdata1をできるだけ小さく保つために。
innodb_thread_concurrency :デフォルト値はzero(0)であり、そのままにしておく必要があります。 方法と理由を説明した以前の投稿を書いた 。
ハイパースレッディングの増加によって複数のコアを使用するための新しい設定があるため、MySQL 5.5にアップグレードする必要があります。オプションは、5.1.38以降のMySQL 5.1に存在しますが、InnoDBプラグインにのみ存在します。 InnoDBプラグインを使用するよりも、5.5にアップグレードする方が簡単で実用的です。