ディスクシークはパフォーマンスに対する大きなボトルネックである。この問題は、データが拡大し、効率的なキャッシュが実行不能になるほど大きくなるにつれて明白になる。大規模データベースで、事実上ランダムにデータにアクセスする場合、読み取りでは最低 1 回、書き込みでは最低 2 回のディスクシークが必要になることがわかる。この問題を最小にするには、シーク回数を減らすようにディスクを使用する。
複数のディスクに対してファイルをシンボリックリンクするか、ストライピングを行って、利用可能なディスクスピンドル数を増加する (およびそれによるシークのオーバヘッドを軽減する)。
シンボリックリンクの使用
MyISAM
テーブルの場合、通常のデータディレクトリ内の位置から別のディスクへのインデックスファイルやデータファイルのシンボリックリンクを行う
(ストライピングも可能)。これによって、ディスクがほかの用途に使用されていなければ、シークと読み取り時間がいずれも改善される。項4.6.1. 「シンボリックリンクの使用」
を参照してください。
ストライピングは、ディスクが多数ある場合に、第
1 ブロックを第 1 ディスクに、第 2
ブロックは第 2 ディスクに、第
N
ブロックは
(
)
ディスクにといった配置を意味する。これにより、通常のデータサイズがストライプサイズより小さい
(または完全に一致している)
場合にパフォーマンスが大幅に改善する。ストライピングはオペレーティングシステムとストライプサイズへの依存性が非常に高いため、ストライプサイズをさまざまに変えながらアプリケーションのベンチマークを行う。項4.1.5. 「ベンチマーク」
を参照してください。
N
MOD
number_of_disks
ストライピングの速度はパラメータによって大きく異なることに注意する。ストライピングパラメータの設定方法とディスク数によって桁ちがいの差異が発生する。ランダムアクセスか順次アクセスのいずれの最適化を行うかの選択が必要なことに注意する。
信頼性を高めるため、RAID 0+1 (ストライピング
+ ミラーリング)
の使用が必要な場合、N
個のドライブのデータの保持に 2 ×
N
個のドライブが必要になる。財務上の余裕がある場合はこれが最適な選択肢になる。しかし、処理の効率化にボリューム管理ソフトウェアへの投資が必要なこともある。
データの種類の重大性に応じて RAID
レベルを変える選択も推奨される。たとえば、ホスト情報やログなどの重要度の高いデータは、RAID
0+1 または RAID N
ディスクに格納し、再生成が可能で重要性が中程度のデータは
RAID 0
ディスクに格納することなどができる。RAID
N
は、パリティビットの更新に時間がかかるため、書き込みが多いと問題になる場合がある。
Linux の場合、hdparm
を使用してディスクのインタフェースを構成することでパフォーマンスを大幅に改善できる。(負荷時に
100% 改善できることも珍しくない。)
次の例は、MySQL(およびその他の多数のアプリケーション)
に非常に適した
hdparm
オプションである。
hdparm -m 16 -d 1
上記を使用した場合のパフォーマンスと信頼性は使用ハードウェアに依存するため、hdparm
の使用後はシステムを総合的にテストするように強く推奨する。詳細については、hdparm
のページを参照。hdparm
の使用が適切でない場合は、ファイルシステムの損傷が発生することがあるため、テストの際はあらかじめすべてのバックアップを取っておく必要がある。
データベースが使用するファイルシステムのパラメータを設定することもできる。
ファイルへの最終アクセス時間を認識する必要がない
(データベースサーバーでは重要度が低い)
場合、-o noatime
オプションを使用してファイルシステムをマウントできる。これで、ファイルシステムの
i
ノードへの最終アクセス時間の更新がスキップされ、一部のディスクシークを回避できる。
多数のオペレーティングシステムで、-o
async
オプションを使用してディスクをマウントし、ファイルシステムが非同期で更新されるように設定できる。使用しているコンピュータが適度に安定している場合は、信頼性を損なわずにさらにパフォーマンスを改善できる。(Linux
ではこのフラグがデフォルトでオンになっている。)