sql >> Databasteknik >  >> RDS >> Mysql

BLOB vs. VARCHAR för att lagra arrayer i en MySQL-tabell

Finns det en anledning till att du inte skapar en underordnad tabell så att du kan lagra ett flyttalsvärde per rad istället för en matris?

Säg att du lagrar tusen arrayer med 300 element vardera per dag. Det är 300 000 rader per dag, eller 109,5 miljoner per år. Inget att nysa åt, men inom kapaciteten för MySQL eller något annat RDBMS.

Angående dina kommentarer:

Visst, om ordern är betydande lägger du till ytterligare en kolumn för ordern. Så här skulle jag designa bordet:

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)
);
  • Totalt utrymme för en rad med vektordata:300x(4+2+2+4) =3600 byte. Plus InnoDB-postkatalog (interna saker) på 16 byte.

  • Totalt utrymme om du serialiserar en Java-array med 300 floats =1227 byte?

Så du sparar cirka 2400 byte, eller 67% av utrymmet genom att lagra arrayen. Men anta att du har 100 GB utrymme för att lagra databasen. Genom att lagra en serialiserad array kan du lagra 87,5 miljoner vektorer, medan den normaliserade designen bara tillåter dig att lagra 29,8 miljoner vektorer.

Du sa att du lagrar några hundra vektorer per dag, så du kommer att fylla upp den där 100 GB-partitionen på bara 81 år istället för 239 år.

Angående din kommentar:Prestanda av INSERT är en viktig fråga, men du lagrar bara några hundra vektorer per dag.

De flesta MySQL-applikationer kan uppnå hundratals eller tusentals inlägg per sekund utan överdriven trolldom.

Om du behöver optimal prestanda, här är några saker att titta på:

  • Explicita transaktioner
  • INSERT-syntax med flera rader
  • INSTÄLL FÖRDRÖJD (om du fortfarande använder MyISAM)
  • LADDA DATAINFIL
  • ÄNDRAR TABELL INAKTIVERA KNAPPAR, gör infogningen, ÄNDRAR TABELL AKTIVERA KEYER

Sök efter frasen "mysql-inlägg per sekund" på din favoritsökmotor för att läsa många artiklar och bloggar som talar om detta.



  1. infoga i lagrad procedur med parametrar MYSQL fungerar inte

  2. Hur man ändrar max_allowed_packet size

  3. Strömma binär fil från MySQL för att ladda ner med PHP

  4. Skapa en fråga i SQL Server 2017