2017-06-07 6 views
-1

私たちのアプリケーションは、センサーコンプレックスからデータを読み取り、それらのタイムスタンプと共にデータベースに書き込みます。新しいデータは、1秒間に約5回センサー複合体(データベースサーバあたり1.10の複合体、データは通常25kBと50kBの2つのブロブを含む)に挿入され、1..3のマシンから読み込まれます(次のような単純な読み込み: select * from table where sensorId=?sensorId and timestamp>?lastTimestamp)。行は決して更新されません。データベース側にレポートは作成されません。古い行は数日後に削除されます。テーブルの1つだけが時々更新を受け取ります。挿入と取り込みのためのMySQLの最適化

メインテーブルのプライマリインデックスは、自動生成されたIDで、sensoridtimestampのインデックスが追加されています。

パフォーマンスは現在のところ非常に悪いです。古いデータの削除には数時間(!)がかかり、多くのデータパケットはデータベースに送信されません。これは、挿入プロセスがセンサー読み取り間の間隔よりも長くかかるためです。このような特定のシナリオでは、どのようにデータベースのパフォーマンスを最適化できますか?

transaction isolation levelREAD_COMMITTEDに設定すると有望に見えますが、innodb_lock_timeoutも便利です。私たちの特定のシナリオで役立つさらなる設定を提案できますか?

アップデートを受け取ったテーブルを取り除くと、さらなる可能性はありますか?

+1

スローインサートが、多くの場合、データベースによって引き起こされるが、すべてのインサートを有するいくつかの巨大なインデックスを再作成する必要があります。質問にテーブルとインデックス定義を追加してください。ありがとう。 – arkascha

+0

質問を編集し、 'SHOW CREATE TABLE tablename'の出力を追加してください。 –

+0

これはdbaの質問のほうがです – Strawberry

答えて

1

古いデータを削除すると、DROP PARTITIONDELETEsよりも速くloooootになります。

詳細:http://mysql.rjweb.org/doc.php/partitionmaint

そして、この「複合」指数、あなたが必要性を述べたSELECTこと:

INDEX(sensorId, timestamp) 
+0

私はそれをテストできませんでしたが、あなたの提案はとても合理的です(私の同僚は、そのデータベースを設計しました。古いデータを新しいデータで更新しています...)。 –

+0

"削除された"列を介して "論理的に"行を削除する場合は、 'SELECTs'に' AND deleted = 0'と言う必要があります。この_may_はパフォーマンスに影響します。 –

関連する問題