このデータモデルを取得しました。限られたツリーの深さを知っているので、現在のテーブルはモデルに対して1:1であり、親ノードへの外部キーがあります。Channel
to Station
、Measurement
to Channel
、。Station
_ クエリの90%は次のとおりです。
select value from measurements where
fk_station=X and fk_channel=Y and timestamp>=A and timestamp<=B
order by timestamp asc
残りの10%は、他のタイムスタンプ付きテーブルと同様ですが、が欠落しているために単純になっていfk_channel
ます。
私たちが直面している問題:テーブルには何億ものユニークな[station,channel,timestamp]
行がMeasurement
あり、成長しています。タイムスタンプインデックスはすでに非常に大きく、順序付け句が非常に遅いため、ステーションIDごとに分割を開始する必要がありました。したがって、テーブルがMeasurement_<Station Id>
あり、Station
外部キーは省略されています。これは非常に役立ちましたが、それでも一部のテーブルには数千万行が含まれていました。負荷のピーク時には、約80000クエリ/分が発生し、これらの大きなテーブルでのクエリは明らかに遅延します。派手な最適化ハックなしで、1つのMySQL/ISAMインスタンスから実行します。ファイルシステムで約150GB。
- そのようなデータモデルを保存するための大幅に異なる/より良い方法はありますか?
- 現在の構造では、このサイズ/負荷でこの種のパフォーマンスの一時的な中断が発生するのは正常ですか?マシンは今日の平均的なハードウェアであり、埋め込まれた原子も8+コアの獣もありません
- テーブルの分割は
Measurement
正しいことでしたか?私たちはSQLの達人ではありませんが、クエリと必要なインデックスは非常に明白であるため、「最適化」することすら考えていませんでした。分割は大いに役立ちましたが、他の何かもそうかもしれません - インデックスを高速化する他の方法はありますか?同じインデックスを何度も繰り返して、同じ結果のサブセットを取得する必要があるのは、ちょっとばかげています。他のインデックスを使用することはなく、に変更することもありません
desc
。非常に特殊なアプライアンスです。インデックスがどういうわけか「ネイティブオーダー」であればいいでしょう:-) Measurement
分割されたテーブルを分散/シャーディングするのに役立ちますか?私が言ったように、いくつかのテーブルはまだ巨大であり、問題は分散が役に立たないインデックスサイズにあると感じているので、おそらくクエリの負荷を下げるだけです...