私たちのアプリケーションは、センサーコンプレックスからデータを読み取り、それらのタイムスタンプと共にデータベースに書き込みます。新しいデータは、1秒間に約5回センサー複合体(データベースサーバあたり1.10の複合体、データは通常25kBと50kBの2つのブロブを含む)に挿入され、1..3のマシンから読み込まれます(次のような単純な読み込み: select * from table where sensorId=?sensorId and timestamp>?lastTimestamp
)。行は決して更新されません。データベース側にレポートは作成されません。古い行は数日後に削除されます。テーブルの1つだけが時々更新を受け取ります。挿入と取り込みのためのMySQLの最適化
メインテーブルのプライマリインデックスは、自動生成されたIDで、sensorid
とtimestamp
のインデックスが追加されています。
パフォーマンスは現在のところ非常に悪いです。古いデータの削除には数時間(!)がかかり、多くのデータパケットはデータベースに送信されません。これは、挿入プロセスがセンサー読み取り間の間隔よりも長くかかるためです。このような特定のシナリオでは、どのようにデータベースのパフォーマンスを最適化できますか?
transaction isolation level
をREAD_COMMITTED
に設定すると有望に見えますが、innodb_lock_timeout
も便利です。私たちの特定のシナリオで役立つさらなる設定を提案できますか?
アップデートを受け取ったテーブルを取り除くと、さらなる可能性はありますか?
スローインサートが、多くの場合、データベースによって引き起こされるが、すべてのインサートを有するいくつかの巨大なインデックスを再作成する必要があります。質問にテーブルとインデックス定義を追加してください。ありがとう。 – arkascha
質問を編集し、 'SHOW CREATE TABLE tablename'の出力を追加してください。 –
これはdbaの質問のほうがです – Strawberry