sql >> データベース >  >> RDS >> Mysql

MySQLテーブルに配列を格納するためのBLOBとVARCHAR

    配列の代わりに行ごとに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」というフレーズを検索して、これについて話している多くの記事やブログを読んでください。



    1. ROWSをCOLUMNSとして取得(SQL Server動的PIVOTクエリ)

    2. データベース値に基づいてチェックするように設定されたPHPチェックボックス

    3. ルート権限を取得されていないAndroidデバイスでデータベースを確認する方法

    4. sqlachemyのhave句でラベルを使用する