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