Mysql
 sql >> Datenbank >  >> RDS >> Mysql

BLOB vs. VARCHAR zum Speichern von Arrays in einer MySQL-Tabelle

Gibt es einen Grund, warum Sie keine untergeordnete Tabelle erstellen, damit Sie anstelle eines Arrays einen Gleitkommawert pro Zeile speichern können?

Angenommen, Sie speichern tausend Arrays mit jeweils 300 Elementen pro Tag. Das sind 300.000 Zeilen pro Tag oder 109,5 Millionen pro Jahr. Nichts zu verachten, aber innerhalb der Möglichkeiten von MySQL oder anderen RDBMS.

Zu Ihren Kommentaren:

Sicher, wenn die Reihenfolge signifikant ist, fügen Sie eine weitere Spalte für die Reihenfolge hinzu. So würde ich die Tabelle gestalten:

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)
);
  • Gesamtspeicherplatz für eine Reihe von Vektordaten:300x(4+2+2+4) =3600 Bytes. Plus InnoDB-Record-Verzeichnis (internes Zeug) von 16 Bytes.

  • Gesamtspeicherplatz, wenn Sie ein Java-Array mit 300 Floats =1227 Bytes serialisieren?

Sie sparen also etwa 2400 Bytes oder 67 % des Speicherplatzes, indem Sie das Array speichern. Angenommen, Sie haben 100 GB Speicherplatz zum Speichern der Datenbank. Durch das Speichern eines serialisierten Arrays können Sie 87,5 Millionen Vektoren speichern, während Sie mit dem normalisierten Design nur 29,8 Millionen Vektoren speichern können.

Sie sagten, Sie speichern ein paar hundert Vektoren pro Tag, sodass Sie diese 100-GB-Partition in nur 81 Jahren statt in 239 Jahren füllen werden.

Zu Ihrem Kommentar:Leistung von INSERT ist ein wichtiges Thema, aber Sie speichern nur ein paar hundert Vektoren pro Tag.

Die meisten MySQL-Anwendungen können Hunderte oder Tausende von Einfügungen pro Sekunde erreichen ohne übermäßige Zauberei.

Wenn Sie eine optimale Leistung benötigen, sollten Sie sich Folgendes ansehen:

  • Explizite Transaktionen
  • Mehrzeilige INSERT-Syntax
  • INSERT DELAYED (falls Sie noch MyISAM verwenden)
  • DATEN INFILE LADEN
  • ALTER TABLE DISABLE KEYS, machen Sie die Einfügungen, ALTER TABLE ENABLE KEYS

Suchen Sie in Ihrer bevorzugten Suchmaschine nach dem Ausdruck „mysql inserts per second“, um viele Artikel und Blogs zu lesen, die darüber sprechen.