BLOB vs VARCHAR pour stocker des tableaux dans une table MySQL
J'ai une conception de la décision à prendre et je suis à la recherche pour certains de meilleurs conseils. J'ai un programme java qui a besoin de stocker un grand nombre (quelques centaines par jour) de la virgule flottante matrices dans une base de données MySQL. Les données sont d'une longueur fixe Double
tableau de longueur 300. Je vois trois options raisonnables:
- Stocker les données sous forme d'un BLOB.
- Sérialiser les données et l'enregistrer comme un VARCHAR.
- Écrire les données sur le disque en tant que fichier binaire et stocker une référence à la place.
Je dois aussi mentionner que ces données seront lues et mises à jour fréquemment.
Je veux utiliser une GOUTTE puisque c'est ce que j'ai fait dans le passé et il semble que la méthode la plus efficace (par exemple, maintient largeur fixe & pas besoin de convertir une chaîne séparée par des virgules). Cependant, mon collègue est en insistant sur le fait que nous devrions sérialiser et l'utilisation varchar pour des raisons qui semblent surtout dogmatique.
Si l'une de ces méthodes est mieux que l'autre, sont les raisons de Java et MySQL spécifique?
+2 à Julius pour répondre à la question spécifique et +1 pour le projet de Loi pour les conseils
OriginalL'auteur Doug | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
Magasin comme un BLOB comme (voir l'exemple de code ci-dessous). Je pense que c'est probablement mieux que d'utiliser la sérialisation java depuis java builtin la sérialisation besoin 2427 octets, et non des applications java sera plus difficile de traiter avec les données. Qui est, faut-il y jamais être quelque de non-java applications de l'interrogation de la base de données dans le futur.... si non, alors l'builtin, la sérialisation est un peu moins de lignes.
Edit: je l'avais espéré d'utiliser les BINAIRES(2400), mais MySQL dit:
OriginalL'auteur Julius Musseau
Est-il une raison pour vous de ne pas créer une table d'enfant de sorte que vous pouvez stocker une valeur à virgule flottante par ligne, au lieu d'un tableau?
Dire que vous stockez un millier de tableaux de 300 éléments de chaque par jour. Que 300 000 lignes par jour, ou de 109,5 millions de dollars par année. Rien à éternuer à, mais dans les capacités de MySQL ou tout autre SGBDR.
Re vos commentaires:
Sûr, si l'ordre est important de vous ajouter une autre colonne de la commande. Voici comment j'avais conception de la table:
Total de l'espace pour une ligne de données vectorielles: 300x(4+2+2+4) = 3600 octets. Plus InnoDB répertoire record (internes) de 16 octets.
Espace Total si vous sérialiser un Java tableau de 300 chars = 1227 octets?
De sorte que vous économiser environ 2400 octets, soit 67% de l'espace par le stockage de la matrice. Mais supposons que vous disposez 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 le normalisé de conception vous permet uniquement de stocker de 29,8 millions de vecteurs.
Vous avez dit que vous stocker quelques centaines de vecteurs par jour, de sorte que vous allez remplir cette partition de 100 go à seulement 81 ans au lieu de 239 ans.
Re votre commentaire: Le rendement de l'INSERT est une question importante, mais vous êtes seulement de stocker quelques centaines de vecteurs par jour.
La plupart MySQL applications peuvent atteindre des centaines ou des milliers de plaquettes par seconde sans trop de sorcellerie.
Si vous avez besoin d'obtenir un rendement optimal, voici quelques choses à rechercher dans:
Recherche de l'expression "mysql insère par seconde" sur votre moteur de recherche préféré pour lire de nombreux articles et des blogs en parlent.
+1 juste pour le dernier paragraphe, le projet de Loi 🙂
Ok encore une fois, je devrait probablement avoir mentionné que le stockage des données n'est pas vraiment le problème ici, c'est la vitesse. Ne de votre solution nécessite 300 fois plus nombreux que les opérations d'INSERTION dans une table avec plusieurs index?
OriginalL'auteur Bill Karwin
Si vous voulez juste pour stocker les données en tant que fichier binaire de vidage de la Java tableau puis, par tous les moyens, de l'utilisation d'une GOUTTE. Votre ami peut bien être conseiller à l'encontre de cette puisque vous voudrez peut-être une non-programme Java à utiliser l'information à une date ultérieure afin binaire dumps sont probablement une douleur à interpréter.
Avec la sérialisation d'un VARCHAR, vous savoir le format de données et peuvent facilement lire avec n'importe quelle application.
Bien sûr, si il y a la moindre chance que vous aurez envie de manipuler ou d'un rapport sur l'individu flotteurs, elles doivent être stockées dans une base de données conviviale. En d'autres termes, pas un cliché binaire, pas sérialisé, pas une colonne CSV.
Les stocker en tant que Codd prévu, en troisième forme normale.
Par la façon dont, à quelques centaines de 300-élément flottant point de tableaux de chaque jour n'est pas une grosse base de données. Prendre de quelqu'un qui travaille sur le mainframe DB2, la plupart des SGBD' sera facilement manipuler ce genre de volume. Nous recueillons des dizaines de millions de lignes, chaque jour, dans notre application, et il n'a même pas casser une sueur.
OriginalL'auteur paxdiablo
À l'aide d'une base de données pour stocker un tableau multidimensionnel est une douleur dans le cul!
Encore plus à l'aide d'un rdm où c'est pas de relation entre les données stockées.
désolé, mais la meilleure solution à mon avis est d'utiliser un fichier et il suffit d'écrire les données sous la forme de u comme.
binaire ou txt.
Ainsi 300xsize de long ou 300x1 ligne txt est un tableau.
OriginalL'auteur xstring