Mysql
 sql >> Base de données >  >> RDS >> Mysql

BLOB vs VARCHAR pour stocker des tableaux dans une table MySQL

Y a-t-il une raison pour laquelle vous ne créez pas de table enfant afin de pouvoir stocker une valeur à virgule flottante par ligne, au lieu d'un tableau ?

Supposons que vous stockiez un millier de tableaux de 300 éléments chacun par jour. Cela représente 300 000 lignes par jour, ou 109,5 millions par an. Rien à redire, mais dans les limites des capacités de MySQL ou de tout autre SGBDR.

Vos commentaires :

Bien sûr, si la commande est importante, vous ajoutez une autre colonne pour la commande. Voici comment je concevrais le tableau :

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)
);
  • Espace total pour une ligne de données vectorielles :300x(4+2+2+4) =3600 octets. Plus le répertoire d'enregistrement InnoDB (éléments internes) de 16 octets.

  • Espace total si vous sérialisez un tableau Java de 300 flottants =1227 octets ?

Vous économisez donc environ 2400 octets, soit 67% de l'espace en stockant le tableau. Mais supposons que vous disposiez de 100 Go d'espace pour stocker la base de données. Le stockage d'un tableau sérialisé vous permet de stocker 87,5 millions de vecteurs, alors que la conception normalisée ne vous permet de stocker que 29,8 millions de vecteurs.

Vous avez dit que vous stockiez quelques centaines de vecteurs par jour, vous remplirez donc cette partition de 100 Go en seulement 81 ans au lieu de 239 ans.

Concernant votre commentaire :Performances d'INSERT est un problème important, mais vous ne stockez que quelques centaines de vecteurs par jour.

La plupart des applications MySQL peuvent réaliser des centaines ou des milliers d'insertions par seconde sans magie excessive.

Si vous avez besoin de performances optimales, voici quelques points à examiner :

  • Transactions explicites
  • Syntaxe INSERT multi-lignes
  • INSERT DELAYED (si vous utilisez toujours MyISAM)
  • CHARGER LE FICHIER DE DONNÉES
  • ALTER TABLE DISABLE KEYS, faites les insertions, ALTER TABLE ENABLE KEYs

Recherchez l'expression "inserts mysql par seconde" sur votre moteur de recherche préféré pour lire de nombreux articles et blogs qui en parlent.