約5,000万行を持ち、インデックスサイズが4 GB(テーブルサイズは約6 GB)のテーブルをクエリすると、データベースサーバーのメモリがスワップされ、速度が大幅に低下するという問題が発生しています。これは、一時テーブルのサイズを超えており、ディスクにスワップされていることに関係していると確信しています。
データベースサーバーを32 GBのRAM= 64 GB RAMにアップグレードした場合、MySQLデータベースがこの追加のメモリを十分に活用してスワップできないのではないかと思います。いくつかの変数(KEY_BUFFER_SIZEなど)を調べたところ、64 GBを超える設定値がサポートされているようですが、MySQLのドキュメントでは、tmp_table_sizeの最大値は4 GBになっています。
それで、メモリのアップグレードはそれだけの価値がありますか? 「querying-large-table」問題はこれから利益を得ますか、それとも4 GBの制限のために役に立たないのでしょうか?テーブルを別の方法でパーティション分割するように再構築するなど他の解決策がある可能性があることはわかっていますが、テーブルについて何も変更せずに、追加のメモリが役立つでしょうか?
また、一般に、32 GBから64 GBのRAMに移動するときにMySQLが利用できない他のメモリ関連の変数はありますか?
データベースサーバーとして64ビットLinux(Ubuntu)を使用しています。
ありがとう、ガレン
InnoDBを使用している場合、設定する最も重要な変数はinnodb_buffer_pool_size
。システムメモリの約80%に設定します。使用後のキャッシュがウォームアップすると、最もアクティブなデータ(作業データセット)がメモリ(innodb_buffer_pool_size)に格納され、その操作が非常に高速になります。 64GBのメモリがあれば、間違いなくそこに多くを収めることができます。メモリは、常にDBサーバーに適しています。
はい-InnoDBを使用し、読み取り集中型のワークロードがある場合は、大量のRAM [データセットがメモリに収まると仮定すると、サーバーは非常に高速になります]を絶対に利用できます] 。
私は、メモリに適合するワーキングセットを備えた8〜16 GBのサーバーで、MySQLとInnoDBストレージを使用しています。
おそらく、メモリにお金をかける前に、システムがスワップする原因を調査するために、余分な時間と労力を費やす価値があるでしょうか?
32GBのメモリは、テーブル全体、インデックス、および最大temp_tableをメモリにロードした後でも、十分な空きメモリを残します。クイック検索により、関連する可能性のある次の2つのドキュメントが表示されました。
非常に大きな一時テーブルが作成されていることが原因であると思われる場合は、一時テーブルを回避するためにクエリを改善する方法を検討する必要があります。
Stackoverflowに、スキーマ、クエリ、説明計画、および問題の詳細を含む投稿を投稿できます。