2013-02-13 4 views
-1

Je suis en train de concevoir un DB mais je ne sais pas quoi faire pour minimiser les frais généraux, j'ai des besoins uniques. l'un des champs pourrait être aussi long que 60kb ou court comme 100 octets, quel genre et quelle longueur devrais-je utiliser dans ce champ pour minimiser les frais généraux à son minimum? J'ai entendu dire que si vous définissiez le maximum à 60k, tout espace inutilisé restant dans la ligne jusqu'à 60k sera rempli d'espace, vous comprenez que cela pourrait causer des frais inutiles, seulement quelques bruts utiliseraient ce Longue durée alors que la plupart des rangées de repos ne le feront pas, que suggérez-vous?Besoin d'aide dans MySQL DB Design (minimiser les frais généraux)

+1

La réservation d'espace inutilisé ne se produit que sur les colonnes 'CHAR'. Vous devriez être bien avec l'un des autres types ('VARCHAR',' TEXT' ...). – Vatev

+0

Avez-vous un problème réel que vous essayez de résoudre ici? Si ce n'est pas le cas, ne vous inquiétez pas de l'utilisation de l'espace à ce stade. –

Répondre

0

Utilisez VARCHAR.

Les valeurs dans les colonnes VARCHAR sont des chaînes de longueur variable. La longueur peut être spécifiée comme une valeur comprise entre 0 et 255 avant MySQL 5.0.3, et entre 0 et 65 535 dans les versions 5.0.3 et ultérieures.

0

un des champs pourrait être aussi longtemps que 60kb ou court 100 octets

sonne comme un BLOB/TEXT. Comme Andreas has pointed out, vous pouvez même utiliser VARCHAR si vous savez avec certitude que vous n'aurez pas besoin de plus de 64K.

J'ai entendu si vous définissez le maximum d'être comme 60k alors chaque espace inutilisé gauche dans la rangée jusqu'à 60k sera rempli d'espace

Si vous utilisez CHAR, le oui: il stocke le rembourrage.

seulement quelques lignes utiliseraient de cette longueur alors que la plupart des lignes de repos ne sera pas

C'est incorrect. Les SGBD modernes stockent des lignes de longueur variable: seul l'espace réellement nécessaire sera réellement utilisé. Utilisez simplement BLOB/TEXT ou VARCHAR et tout ira bien.

2

MySQL, VARCHAR stocke sur le disque compact , soit il ne stocke que la chaîne de caractères utilisés sur une ligne donnée, plus un octet ou deux pour coder la longueur de cette chaîne. Cela est vrai pour les données et les index.

Mais une fois que le VARCHAR est chargé hors du moteur de stockage et dans la mémoire, il est rembourré sur toute sa longueur. Cela consomme inutilement beaucoup de mémoire si vous déclarez VARCHAR(65535). Cette représentation peut alors se retrouver sur le disque pendant le tri ou les opérations de table temporaires. Par conséquent, utilisez TEXT. Ce type de données n'est pas bourré dans la mémoire comme le fait VARCHAR, et il prend également en charge les chaînes de 64 Ko.

Si vous avez besoin de chaînes plus longues, utilisez MEDIUMTEXT qui prend en charge jusqu'à 16 Mo.

+0

La consommation de mémoire 'VARCHAR' s'applique-t-elle aux requêtes ** all **? Votre réponse plus tôt http://stackoverflow.com/a/1962329/1611055 me laisse penser qu'elle s'applique seulement en utilisant des tables 'MEMORY' ou' temporary' (qui pourraient certainement être assez importantes, bien sûr) –

+0

@Andreas, j'ai Depuis appris (du directeur du développement de serveur chez Percona) qu'il s'applique à * toutes * les lignes, car ils doivent tous être représentés d'une manière indépendante du stockage dans la couche SQL. –

+0

Merci Bill - gardez cela à l'esprit pour les futures conceptions de schéma :) –

Questions connexes