この質問はおそらくStackOverflowでも質問される可能性がありますが、最初にここで試してみましょう...
データベース内のINSERTおよびUPDATEステートメントのパフォーマンスが低下し、Webアプリのパフォーマンスが低下しているようです。
テーブルはInnoDBであり、アプリケーションはトランザクションを使用します。スピードアップするために簡単に調整できるものはありますか?
ロックの問題が発生していると思いますが、どうすれば確認できますか?
ハードウェアとOSが適切に構成および調整されているかどうかを確認します。
MySQL/InnoDBインスタンスが適切に調整されているかどうかを確認します。
Load data infile
_コマンドは、一連の挿入に対してはるかに高速です。select count(*) from table;
は、myisamよりもinnodbの方がはるかに低速です。私たちの環境では、あるタイプの更新クエリが遅いという状況がありました。バッチジョブを完了するための推定時間は2日でした!!! slowqueryログを分析した後、このタイプの更新クエリが完了するまでに4秒かかることがわかりました。クエリは次のようになりました:_
update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz
_。更新クエリを選択クエリに変換し、その選択クエリで説明を実行した後、このタイプのクエリはインデックスを使用しません。適切なインデックスを作成した後、更新クエリの実行時間をミリ秒に減らし、ジョブ全体を2時間未満で完了しました。
いくつかの便利なリンク:
デフォルトのinnoDB構成では、トランザクションをディスクに書き込んでフラッシュできる速度に制限されます。 ACIDの損失に対処できる場合は、innodb_flush_log_at_trx_commitを試してください。約1秒ごとにログをディスクに書き込んでフラッシュするには、0に設定します。コミットごとに書き込みおよびフラッシュするには、1(デフォルト)に設定します。 2に設定すると、コミットのたびにログファイルに書き込まれますが、フラッシュは1秒に1回だけです。
1トランザクションの損失に対処できる場合、これは書き込みパフォーマンスを大幅に向上させる優れた方法です。
また、ディスクの動作にも注意してください。 RAID 10> RAID 5は、追加のディスクを犠牲にして書き込みを行います。
Innodbモニターをオンにすると、ロックとデッドロックの原因を特定するのに役立ちます。
ロックの問題は、show full processlist;
の接続ステータスに例示されます
my.cnf
およびMySQLのドキュメントを読みます。設定オプションは非常によく文書化されています。
一般的に言えば、メモリ内でできるだけ多くのデータを処理する必要があります。クエリの最適化では、これは一時テーブルを回避することを意味します。インデックスの適切な適用。
チューニングは、使用するデータベースエンジンとアプリケーションアーキテクチャに固有になります。既存のインターネット検索にはかなりのリソースがあります。
自動コミットを無効にしてJavaで変更をコミットするだけで、WebアプリケーションのMySQLで挿入と更新のパフォーマンスの問題を解決する方法mysqlのドキュメントで提案されています。
InnoDBはかなり良いエンジンです。ただし、これは「調整」されることに大きく依存しています。 1つのことは、挿入が主キーの増加順になっていない場合、innoDBはMyISAMよりも少し長くかかることがあります。これは、より高いinnodb_buffer_pool_sizeを設定することで簡単に克服できます。私の提案は、RAM全体の60〜70%に設定することです。現在、このようなサーバーを4つ運用し、1分あたり約350万行を挿入しています。すでに3テラバイト近くあります。 InnoDBは、非常に並行した挿入のため、でなければなりませんでした。インサートを高速化する方法は他にもあります。そして、私はいくつかをベンチマークしました。