Mysql
 sql >> Database >  >> RDS >> Mysql

BLOB vs. VARCHAR per la memorizzazione di array in una tabella MySQL

C'è un motivo per cui non crei una tabella figlio in modo da poter memorizzare un valore in virgola mobile per riga, invece di un array?

Supponiamo di memorizzare un migliaio di array di 300 elementi ciascuno al giorno. Sono 300.000 righe al giorno o 109,5 milioni all'anno. Niente su cui starnutire, ma all'interno delle capacità di MySQL o di qualsiasi altro RDBMS.

Re i tuoi commenti:

Certo, se l'ordine è significativo aggiungi un'altra colonna per l'ordine. Ecco come disegnerei il tavolo:

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)
);
  • Spazio totale per una riga di dati vettoriali:300x(4+2+2+4) =3600 byte. Più la directory dei record InnoDB (roba interna) di 16 byte.

  • Spazio totale se serializzi un array Java di 300 float =1227 byte?

Quindi risparmi circa 2400 byte, o il 67% dello spazio memorizzando l'array. Ma supponiamo di avere 100 GB di spazio per archiviare il database. La memorizzazione di un array serializzato consente di memorizzare 87,5 milioni di vettori, mentre il design normalizzato consente di memorizzare solo 29,8 milioni di vettori.

Hai detto di archiviare alcune centinaia di vettori al giorno, quindi riempirai quella partizione da 100 GB in soli 81 anni invece di 239 anni.

Per il tuo commento:Prestazioni di INSERT è un problema importante, ma memorizzi solo poche centinaia di vettori al giorno.

La maggior parte delle applicazioni MySQL può ottenere centinaia o migliaia di inserimenti al secondo senza eccessiva magia.

Se hai bisogno di prestazioni ottimali, ecco alcuni aspetti da considerare:

  • Transazioni esplicite
  • Sintassi INSERT su più righe
  • INSERIRE RITARDATO (se utilizzi ancora MyISAM)
  • CARICA FILE DATI
  • ALTER TABLE DISABLE KEYS, fare gli inserti, ALTER TABLE ENABLE KEYS

Cerca la frase "mysql inserts al secondo" sul tuo motore di ricerca preferito per leggere molti articoli e blog che ne parlano.