配列の代わりに行ごとに1つの浮動小数点値を格納できるように、子テーブルを作成しない理由はありますか?
1日に300個の要素の1000個の配列を格納するとします。これは、1日あたり30万行、つまり1年あたり1億950万行です。くしゃみをするものはありませんが、MySQLまたはその他のRDBMSの機能の範囲内です。
コメントを再確認してください:
確かに、注文が重要な場合は、注文に別の列を追加します。テーブルのデザイン方法は次のとおりです。
CREATE TABLE VectorData (
trial_id INT NOT NULL,
vector_no SMALLINT UNSIGNED NOT NULL,
order_no SMALLINT UNSIGNED NOT NULL,
element FLOAT NOT NULL,
PRIMARY KEY (trial_id, vector_no),
FOREIGN KEY (trial_id) REFERENCES Trials (trial_id)
);
-
ベクトルデータの行の合計スペース:300x(4 + 2 + 2 + 4)=3600バイト。さらに、16バイトのInnoDBレコードディレクトリ(内部のもの)。
-
300フロートのJava配列をシリアル化する場合の合計スペース=1227バイト?
したがって、配列を格納することで、約2400バイト、つまりスペースの67%を節約できます。ただし、データベースを格納するための100GBのスペースがあるとします。シリアル化された配列を格納すると、8,750万個のベクトルを格納できますが、正規化された設計では、2,980万個のベクトルしか格納できません。
1日に数百のベクターを保存するとおっしゃっていたので、その100GBのパーティションは239年ではなく81年でいっぱいになります。
コメントを再確認してください:INSERTのパフォーマンス これは重要な問題ですが、1日あたり数百のベクターしか保存していません。
ほとんどのMySQLアプリケーションは、毎秒数百または数千の挿入を実現できます。 過度の魔法を使わずに。
最適なパフォーマンスが必要な場合は、次の点を確認してください。
- 明示的なトランザクション
- 複数行のINSERT構文
- INSERT DELAYED(まだMyISAMを使用している場合)
- データファイルの読み込み
- ALTER TABLE DISABLE KEYS、挿入、ALTER TABLE ENABLE KEYS
お気に入りの検索エンジンで「mysqlinsertspersecond」というフレーズを検索して、これについて話している多くの記事やブログを読んでください。