ディスクシークはパフォーマンスの大きなボトルネックです。この問題は、データの量が、効果的なキャッシュが実行不能になるほど大きくなり始めると、明確になります。多かれ少なかれランダムにデータにアクセスする大きなデータベースの場合、読み取りには最低 1 回、書き込みには 2 回のディスクシークが確実に必要になります。この問題を最小にするには、少ないシーク回数でディスクを使用します。
-
さまざまなディスクにファイルをシンボリックリンクするか、ディスクストライピングを行なって、使用可能なディスクスピンドル数を増やします (およびそれによってシークのオーバーヘッドを軽減します)。
-
シンボリックリンクの使用
これは、
MyISAM
テーブルの場合、データディレクトリ内の通常の場所から別のディスクへのインデックスファイルやデータファイルのシンボリックリンクを作成する (ストライピングされることもある) ことを意味します。ディスクがほかの目的にも使用されていないものとして、これによって、シークと読み取り時間がともに改善されます。セクション8.11.3.1「シンボリックリンクの使用」を参照してください。 -
ストライピングは、多数のディスクがあり、最初のブロックを最初のディスクに、2 番目のブロックを 2 番目のディスクに、
N
番目のブロックを (
) 番目のディスクにというように配置することを意味します。つまり、通常のデータサイズがストライプサイズより小さい (または完全に一致している) 場合に、パフォーマンスが大幅に向上します。ストライピングはオペレーティングシステムとストライプサイズに大きく依存するため、さまざまなストライプサイズでアプリケーションのベンチマークを行なってください。セクション8.12.3「独自のベンチマークの使用」を参照してください。N
MODnumber_of_disks
ストライピングの速度の違いは、パラメータに大きく依存します。ストライピングパラメータの設定方法とディスク数によって、桁違いの差が測定されることがあります。ランダムアクセスに対する最適化か順次アクセスに対する最適化かを選択する必要があります。
-
信頼性のため、RAID 0+1 (ストライピングとミラーリング) を使用したいと考える場合がありますが、この場合、
N
個のドライブのデータを保持するために 2 ×N
個のドライブが必要です。これは、そのための資金がある場合に最適なオプションである可能性があります。ただし、それを効率的に処理するために、何らかのボリューム管理ソフトウェアに投資する必要がある場合もあります。適切なオプションは、ある種類のデータがどのくらい重要であるかに応じて RAID レベルを変えることです。たとえば、再生成が可能なやや重要なデータは RAID 0 ディスクに格納しますが、ホスト情報やログなどの本当に重要なデータは、RAID 0+1 または RAID
N
ディスクに格納します。RAIDN
は、パリティビットの更新に必要な時間のため、多くの書き込みがある場合に問題になる可能性があります。-
Linux では、
hdparm
を使用して、ディスクのインタフェースを構成することによって、パフォーマンスを大幅に向上できます。(負荷時に最大 100% も珍しくありません。)次のhdparm
オプションは、MySQL、およびおそらくその他の多くのアプリケーションに非常に適しているはずです。hdparm -m 16 -d 1
このコマンドを使用したときのパフォーマンスと信頼性はハードウェアに依存するため、
hdparm
の使用後はシステムを徹底的にテストすることを強くお勧めします。詳細については、hdparm
のマニュアルページを参照してください。hdparm
を適切に使用しないと、ファイルシステムの破損が発生することがあるため、実験する前に、すべてをバックアップしてください。 -
データベースが使用するファイルシステムのパラメータを設定することもできます。
ファイルに最後にアクセスされたタイミングを知る必要がない (実際にデータベースサーバーで役立たない) 場合、
-o noatime
オプションを使用してファイルシステムをマウントできます。それは、ファイルシステム上の i ノードの最終アクセス時間への更新をスキップするため、一部のディスクシークが避けられます。多くのオペレーティングシステムで、
-o async
オプションを使用してファイルシステムをマウントすることによって、ファイルシステムが非同期に更新されるように設定できます。コンピュータが適度に安定している場合、これにより、それほど信頼性を犠牲にすることなく、パフォーマンスが向上するはずです。(Linux ではこのフラグがデフォルトでオンにされています。)