2014-05-14 5 views
1

Débutant ici. Plus d'une question de conception. Je dois donc choisir l'une des approches de stockage suivantes pour de meilleures performances (j'ai tendance à vérifier le type de l'enregistrement plusieurs fois) tout en traitant un grand ensemble de données dans la base de données MySQLOptimisation des performances MySQL

1) deux colonnes - une pour le type de l'enregistrement (varchar (11)), et la valeur (int (11))

eg: type="one", value= 12 

2) la fusion des colonnes et préfixer le type avant que la valeur

eg: value="one_12" 

Quelle approche semble plus réalisable? Merci de votre aide.

+1

La deuxième approche viole le principe de [atomicité] (http://en.wikipedia.org/wiki/First_normal_form#Atomicity), et donc le 1NF. –

Répondre

3

approche 1 est préférable car vous devez interroger le type d'enregistrement plusieurs fois. problème de performance avec l'approche 2 parce que chaque fois que vous devez faire une opération de chaîne pour extraire le type d'enregistrement à partir des données, puis correspondre

4

Évidemment, la première variante. Le second tue l'idée de structuration de données et de base de données relationnelle. Commencez par lire la base de données normalization.

1

Je recommande l'approche numéro un. Vraisemblablement, vous stockez le type dans une table de faits et joignez-le à vos données brutes. Si c'est le cas, il faudra beaucoup moins de stockage au nom de la plus grande table pour stocker une petite valeur entière et (en supposant que vous créez un index sur (valeur, type)) se joindre à la table de faits sera très efficace et rapide.

En d'autres termes, je vous recommande quelque chose comme le

suivant Tableau de données: id, les données, plus de données, type_value

table Type: type_value, le type

Index du type table utilisant un index composite (alias complexe alias multicolumn) sur (type, type_value). Ensuite, votre jointure peut exploiter un indice de couverture, par exemple,

SELECT a.* 
FROM data AS A 
INNER JOIN type AS b 
ON a.type_value = b.type_value 
WHERE b.type = ? 

Notez que les questions d'ordre dans les indices composés dans MySQL. Donc, si le but est en effet d'évaluer WHERE b.type = "One" (par exemple), vous voudrez indexer (type, type_value), et non l'inverse. Cela vous permettra de filtrer votre table de types et d'appliquer la valeur d'un index sans avoir recours à une fusion d'index.

1

L'approche 1 est meilleure que la 2e. Mais voici ma suggestion si vous avez la liste des types définis.

Créer une nouvelle table pour les types (int type_id, type varchar) et indexer la colonne de type varchar. Utilisez la référence de clé étrangère dans votre tableau actuel. Ce serait un moyen idéal de gérer lorsque votre table grandit.

Questions connexes