2009-06-23 8 views
1

J'ai une table MySQL-InnoDB avec plus de 350 000 lignes, contenant un couple de choses comme id, otherId, shortTitle et ainsi de suite. Maintenant, j'ai besoin d'un champ Bool/Bit pour quelques centaines ou milliers de lignes. Devrais-je simplement ajouter ce champ bool dans la table, ou devrais-je créer une nouvelle table en référençant les ID de l'ancienne table - sans risquer de causer des problèmes de performances sur toutes les anciennes fonctions existantes qui accèdent à la première table?Faut-il éviter d'ajouter un autre champ à une table MySQL plus grande?

(info Side: Je ne suis jamais en utilisant "SELECT * ..." Le tableau principal a beaucoup de lecture, d'écriture rarement..)

Répondre

4

L'ajout d'un champ peut en effet gêner un peu les performances, car votre rangée de tables grossit, mais ce n'est pas vraiment un problème pour un champ BIT. Très probablement, vous aurez exactement le même nombre de lignes par page, ce qui signifie qu'il n'y aura aucune baisse de performance. Par contre, l'utilisation d'un JOIN supplémentaire pour accéder à la valeur de ligne dans une autre table sera beaucoup plus lente.

Je ajouterais la colonne à droite dans la table.

2

Qu'est-ce que la nouvelle colonne représentent? Du point de vue de la modélisation des données, si la colonne appartient aux données sous n'importe quelle forme normale, placez-la avec les données; l'impact sur les performances soit damné. Si la colonne n'appartient pas directement à la table, placez-la dans une seconde table avec une clé étrangère. En réalité, l'impact sur les performances de l'ajout d'une nouvelle colonne sur une table avec ~ 350 000 ne sera pas particulièrement important. Avez-vous essayé d'émettre l'instruction ALTER TABLE par rapport à une copie, peut-être sur un poste de travail local?

+0

La nouvelle colonne indique "l'image a une version zoom" - elle peut être fausse ou vraie, jamais nulle, et est fausse (mais connue) pour la plupart des lignes pour le moment. –

0

Exiger un champ de bits pour les entrées suivantes seulement sonne comme vous voulez implémenter l'héritage. Si c'est le cas, je l'ajouterais à une nouvelle table pour que les choses restent lisibles. Sinon, peu importe si vous l'ajoutez ou non à la table principale, à moins que vos requêtes n'utilisent pas d'index, auquel cas je changerais cela avant de prendre d'autres décisions concernant les performances.

+0

Le champ est destiné à indiquer "l'image a une version zoom" - il peut être faux ou vrai, jamais nul, et est faux (mais connu) pour la plupart des lignes pour le moment.Je vais pour Bit (1) comme je l'ai entendu que:

 Before MySQL(InnoDB) 5.0.5: BOOL = BIT = TINYINT(1) = 0 to 255 Since MySQL(InnoDB) 5.0.5: BOOL = TINYINT(1) = 0 to 255 BIT(1) = 0 or 1

+0

Le plus rapide booléen dans mysql est toujours 'varchar (0) NULL', NULL étant faux, et le char vide '' étant vrai. – soulmerge

1

Je ne sais pas pourquoi les gens insistent dans les tables appelées 350K-row grand. Dans le monde mainframe, c'est la taille des tables de configuration de SGBD :-). Cela dit, vous devriez concevoir vos tables en troisième forme normale. Si, et seulement si, vous avez des problèmes de performance, alors devriez-vous considérer la normalisation?

Si vous avez une colonne qui ne s'appliquera qu'à certaines lignes, il ne s'agira probablement pas de 3NF pour la mettre dans la même table. Vous devriez avoir une table séparée avec une clé étrangère dans votre table 'principale'. N'oubliez pas que le champ booléen n'applique pas à certaines des lignes. C'est une situation différente au champ s'appliquant à toutes les lignes mais n'étant pas connue pour certaines. Dans ce cas, une colonne nullable dans la table primaire serait préférable. Mais cela ne ressemble pas à ce que vous décrivez.

+0

"Si vous avez une colonne qui ne s'appliquera qu'à certaines des lignes, il ne s'agira probablement pas de 3NF pour la mettre dans la même table." Eh bien, en fait, cela s'applique à tous les domaines. Spécifiquement, chaque rangée contient une référence à une image, et le champ Bit est appelé "hasLargeVersion", c'est-à-dire indiquant si oui ou non il y a une image de zoom. Comme je ne suis en train d'ajouter que de grandes versions à certaines images, la valeur sera 0 pour la plupart et 1 pour certaines images (mais jamais nul). PS: Appelé le tableau "plus grand" essayant de signifier "grand mais pas grand" :) –

+1

Ensuite, il devrait être dans le même tableau en supposant qu'il répond aux autres critères 3NF - doit dépendre de la clé (1NF), l'ensemble clé (2NF) et rien que la clé (3NF), alors aidez-moi Codd :-) – paxdiablo