web-dev-qa-db-ja.com

MySQLのどの構成オプションが最大の速度改善を提供しますか?

MySQLのどの構成オプションが最大の速度改善を提供しますか?

実際の構成ファイルの改善、テーブルの種類、ハードウェアのセットアップ、レプリケーションなどについて疑問に思っています。クエリの構造とテーブルの構造(これらはWebサイトとStack Overflowで簡単に見つけることができます)以外のもの。クエリキャッシュ設定のようなものが最も速くなったのですか?ドライブはどうですか。外部RAIDまたは内部RAIDに搭載する方が良いですか?特に大規模な読み取りクエリの場合、レプリケーションによってパフォーマンスが向上しましたか?

MySQLのパフォーマンスを向上させるために、他にどのような設定/変更を加えましたか?

注:これらは使用法に非常に依存している(つまり、小規模なWebサイトとデータウェアハウス)ことに気づきますが、私たちのほとんどはおそらくさまざまなサイト/システムで作業していると思うので、さまざまな方法に適用できるさまざまな手法を知っておくとよいでしょう状況。また、いくつかのテクニックは状況間で移行できると思います。

29
Darryl Hein

ここに私の推薦があります(あなたのミレージは異なるかもしれません)

  • ハードウェアRAIDを使用します。これは、他の投稿でソフトウェアRAIDを使用するという私の推奨に反していますが、これはハードウェアRAIDカードが必要な特定の状況です。具体的には、ログファイルをディスクにfsyncするのにかかる時間を短縮するために、RAIDカードのバッテリバックアップのNVRAMが必要です。
  • RAID 1またはRAID 10ボリュームのみを使用してください。 RAID 5または6書き込みのコストは高すぎて、読み取り/書き込みの混合ワークロードでは許容できません。
  • データ、ログ、およびtmpボリュームには個別のLUNを使用します。これらはすべて、OSおよびスワップボリュームから分離する必要があります。
  • InnoDB を使用します。
  • Innodb_file_per_tableを使用
  • 64ビットOSを使用する
  • InnoDBバッファープールを使用可能なRAMの約80%に設定します
  • ログファイルをバッファプールサイズの1/4に設定します。ログファイルは2〜4です。ログファイルが大きいほど、シャットダウンと回復に時間がかかりますが、大きなデータベースダンプをより速く復元できます。
  • log_slow_queries、log-queries-not-using-indexes、set-variable = long_query_time = 1、そのログのすべてのクエリを調査し、スキーマをリファクタリングして、可能な限りテーブルスキャンとtmpテーブルを回避します。
20
Dave Cheney

もう一度、デイブ・チェイニーは本当にここの公園からそれをノックアウトしました。あなたの質問に対する彼の答えには何も付け加えることができません。しかし、私はあなたが尋ねなかったことを指摘したいと思います。 Jeremy ZawodnyとPeter Zaitsevが私に何年も前に教えたように、不良クエリの追跡と最適化に費やした時間のROIは、構成変更に10倍の時間を費やしたROIを上回ります。確かに、不適切な構成、間違ったRAIDセットアップ、または不十分なRAMは必要ありません。しかし、MySQL DBAの優れたクエリは、優れた限界にさえあります(通常、DBAではなく開発者/フレームワークからの)クエリはchronic状態であり、悪い構成はendurable oneです。 。

(私はしばらくの間それらの形容詞を探しましたが、それでも私が選んだものに満足していません。)

開発者がRuby on Rails and Django)のようなフレームワークで一般的なORMを使用している場合、本当に監視する必要があることを再度強調したいと思います。あなたのDBにヒットするクエリです。開発者がSQLについて考えるのをやめてDBを抽象化させると、これは非常に厄介です。先ほど述べた2つのフレームワークが大好きです(口に出さないように私を投票しないでください)。 Query Sleuthingを非常に重要にします(Read:Job Security)。

11
Bruno Bronosky

他にはほとんどありません(Dave Cheneyの回答には記載されていません)

  • データのダブルバッファリングを回避するために、innodb_flush_methodをO_DIRECTに設定してみてください。 RAIDカードにバッテリバックアップ式ライトキャッシュがない場合、またはデータがSAN上にある場合は、これを避けてください。

  • また、innodb_thread_concurrencyを操作します。デフォルトは8だと思いますが、これを調整してパフォーマンスが向上するかどうかを確認する価値があります。

  • クエリキャッシュがオンになっていることを確認し、統計でヒット率を確認してください。良い場合は、値を増やしてヒット率が向上するかどうかを確認してください。

  • 実行するアプリケーションによっては、デフォルトの分離レベルを変更できる場合があります。デフォルトはREPEATABLE_READですが、READ_COMMITTEDによりパフォーマンスが向上する場合があります

  • ステートメントがほとんどUPDATEとDELETEである場合は、変更する結果セットを返すSELECTクエリを実行して、スレーブのキャッシュを準備することができます。これを行う mk-slave-prefetch ツールをチェックしてください

  • MyISAMやInnoDB以外のストレージエンジンをご覧ください。

4
Nathan

ハードウェアについては何も言えませんが、 http://blog.mysqltuner.com を試してみてください。これは、MySQL設定を分析するPerlスクリプトです。

http://www.thomas-krenn.com/de/wiki/MySQL_Performance_Tuning#mysqltuner.pl でサンプル出力を確認できます。

3
weeheavy

最初にすべきことは、メモリパラメータを確認することです。 MySQLのデフォルト設定は非常に保守的です。どのエンジンを使用する場合でも、メモリパラメータの数を10倍または100倍に増やす必要があるでしょう。

次にすべきことは、テーブルキャッシュを確認することです。デフォルト値は64です。これは、約60以下のテーブルがある場合にのみ役立ちます。あなたはそれを長い道のりで上げたいと思うでしょう。

3番目にすべきことは、スレッドと接続パラメーターを確認することです。ほとんどのWebベースのアプリケーションでは、デフォルトのwait_timeoutは非常に長く、30秒程度に短縮できます。これにより、メモリ使用量も改善されます。MySQLは接続をより早く取得し、「スリープ」状態で横になっていることはほとんどなくなります。

1
staticsan