MySQL にキーと値のストアを実装する必要がある場合、これ以上複雑にする意味はありません。
create table key_value_store (
run_time datetime not null,
key_name varchar(15) not null,
key_value varchar(15) not null,
primary key (run_time, key_name)
);
キーと値の両方の平均長が 10 バイトの場合、1 か月あたり約 8600 万行と 2.5 GB であり、結合は必要ありません。すべての値 (列 key_value) が整数または浮動小数点数の場合、データ型を変更してスペースをもう少し減らすことができます。
SQL でキー値ストアを実装する際の主な問題の 1 つは、すべての値が同じデータ型でない限り、すべての値に対して varchar(n) などを使用する必要があることです。タイプ セーフと宣言的制約が失われます。(key3 の値が 1 から 15 の間であり、key7 の値が 0 から 3 の間であることを確認することはできません。)
これは実現可能ですか?
この種の構造 (「EAV」--Google として知られている) は、よく知られたテーブル設計のアンチパターンです。問題の一部は、基本的に列を行として格納していることです。(列名を key_value_store.key_name に格納しています。)通常のテーブルの形式でデータを書き出す必要がある場合は、3 つのことがわかります。
- 適切な形式で出力するクエリを作成するのは困難です。
- 実行するには永遠に時間がかかります。何百もの列を作成する必要がある場合、実行が完了しない可能性があります。
- もっと高速なハードウェアがあればいいのにと思うでしょう。はるかに高速なハードウェア。
私が探しているもの
- キーを論理テーブルにグループ化する機会。これは最初のデザインに関係しており、あなたには当てはまらないかもしれません。あなたのアプリケーションは基本的にログ ファイルを保存しているように思えますが、実行のたびにどのキーが値を持つかわかりません。
- 行数を減らす機会。「書く頻度を減らすことはできますか?」と尋ねます。そのため、3 秒ごとではなく、5 秒または 6 秒ごとにデータベースに書き込むことを検討します。これは、書き込む行が少ないことを意味すると仮定します。(本当の目標は、書き込みを減らすことではなく、行を減らすことです。)
- 適切なプラットフォーム。これには、PostgreSQL 9.2 の方が適している可能性があります。バージョン 9.2 にはインデックスのみのスキャンがあり、キー値ストアを実装する hstore モジュールがあります。
決める前にテストする
私があなたの立場なら、MySQL と PostgreSQL の両方でこのテーブルを構築します。それぞれに約 100 万行のランダムなデータをロードします。次に、それぞれについていくつかのクエリとレポートを試します。(レポートは重要です。) パフォーマンスを測定します。負荷を 1000 万行に増やし、サーバーと dbms を再調整し、同じクエリとレポートを再度実行します。再度測定します。
1 億行で繰り返します。自信がついたらやめましょう。これには数日かかると予想してください。