2010-05-25 4 views
1

J'ai une table de test. La table de test est la suivante:MySQL + MyISAM taille de la table question

CREATE TABLE `mytest` (
    `num1` int(10) unsigned NOT NULL, 
    KEY `key1` (`num1`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

J'ai inséré 50 millions de lignes dans cette table. Quand j'indique l'état de la table, l'avg_row_length est 7. Je m'attendais à voir 4 puisque mySQL utilise 4 octets pour les entiers. Est-ce que la clé a un effet sur avg_row_length? Quand je regarde mon fichier .MYD la taille est de 334 Mo ce qui est exactement ce qu'il devrait être donné que le avg_row_length est 7, mais je m'attendais vraiment à voir 190 Mo étant donné que je n'ai qu'un int.

+----------------+--------+---------+------------+----------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ 
| Name   | Engine | Version | Row_format | Rows  | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time   | Update_time   | Check_time | Collation   | Checksum | Create_options | Comment | 
+----------------+--------+---------+------------+----------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ 
| mytest   | MyISAM |  10 | Fixed  | 50000000 |    7 | 350000000 | 1970324836974591 | 600518656 |   0 |   NULL | 2010-05-22 09:15:06 | 2010-05-22 19:32:53 | NULL  | latin1_swedish_ci |  NULL |    |   | 

J'ai inclus la sortie de l'état de la table show pour la table mytest. Désolé pour le formatage: D Merci d'avance!

Alessandro Ferrucci

+0

est-ce que ce byhead à 3 octets reste cohérent sur différentes tailles? Que se passe-t-il si vous n'avez pas de clé? Le meilleur que j'ai pu trouver est: http://forge.mysql.com/wiki/MySQL_Internals_MyISAM bien que je n'ai rien trouvé dans ce qui me semblait être "Il y a toujours un overhead de 3 octets sur les colonnes". – Mike

+0

Ceci est particulier. MyISAM n'ajoutera normalement qu'un en-tête pour les tables contenant des colonnes ou des chaînes NULL-able: l'en-tête indique la longueur totale de la ligne et contient un indicateur de bit pour chaque colonne NULLable. Ni s'appliquent ici - donc je suis surpris. Si vous ajoutez une seconde colonne "int not null", la longueur de la ligne avg passe à 9 octets, c'est-à-dire. un surcoût de 1 octet. – Martin

+0

La réponse est dans la page suivante - la section décrivant l'en-tête d'enregistrement: http://forge.mysql.com/wiki/MySQL_Internals_MyISAM#MyISAM_Record_Structure Un drapeau indique si l'enregistrement a été supprimé. Cela expliquerait un en-tête d'enregistrement à octet unique pour une table sans colonnes NULLable, mais n'expliquerait pas un en-tête de 3 octets. – Martin

Répondre

2

Je pense que le problème est avec la taille du pointeur MySQL utilise par défaut.

Une citation de MySQL reference:

AVG_ROW_LENGTH

Une approximation de la longueur de la ligne moyenne de votre table. Vous devez définir ceci uniquement pour les grandes tables avec des lignes de taille variable. Lorsque vous créez une table MyISAM, MySQL utilise le produit des options MAX_ROWS et AVG_ROW_LENGTH pour déterminer la taille de la table résultante. Si vous ne spécifiez aucune de ces options, la taille maximale des fichiers de données et d'index MyISAM est de 256 To par défaut. (Si votre système d'exploitation ne prend pas en charge les fichiers volumineux, la taille des fichiers est limitée par la taille du fichier.) Si vous souhaitez réduire la taille des pointeurs pour réduire l'index et le réduire, vous n'avez pas besoin de fichiers volumineux. peut diminuer la taille du pointeur par défaut en définissant la variable système myisam_data_pointer_size. (Voir Section 5.1.4, «Variables système du serveur».) Si vous souhaitez que toutes vos tables dépassent la limite par défaut et que vos tables soient légèrement plus lentes et plus grandes que nécessaire, vous pouvez augmenter la taille du pointeur par défaut en définissant cette variable. Si vous définissez la valeur sur 7, la taille des tables peut atteindre 65 536To.

Essayez de mettre MAX_ROWS et AVG_ROW_LENGTH vous sur la création de table ou ALTER TABLE déclaration et voir, si cela a aidé.

+0

Intéressant.J'ai essayé de définir simplement AVG_ROW_LENGTH puisque c'est vraiment ce que je cherchais à resserrer. Cela a pris un temps très court et n'a rien fait (AVG_ROW_LENGTH était encore 7). J'ai ensuite mis les deux variables avec l'instruction suivante: alter table mytest MAX_ROWS = 50000000 AVG_ROW_LENGTH = 4; et maintenant le AVG_ROW_LENGTH est 5 (octets je suppose). Je ne suis pas sûr de ce que MyISAM utilise cet octet supplémentaire pour ... bourrage d'octets? mais pourquoi aurait-il besoin de remplir une taille d'octet déjà égale? –

+0

J'ai oublié d'ajouter, maintenant toute la taille .MYD est de 239 Mo, ce qui ne se calcule pas à 5 * 500 000 000. Est-ce que quelqu'un sait si modifier une table et changer la longueur de rangée maximum et avg_row_size permet à myISAM de faire des optimisations d'économie d'espace dans la manière dont il stocke les données? –

+0

@alessandro ferrucci: Je ne suis pas sûr, mais je pense que les 'AVG_ROW_LENGTH' et' MAX_ROWS' ne sont que des valeurs recommandées. Et probablement, AVG_ROW_SIZE est même calculé en fonction de la taille actuelle des données et de row_count. Mais je ne pense pas que MySQL réserve de l'espace exactement pour le nombre actuel de lignes, donc vous obtenez la différence. Ce sont mes propres spéculations cependant. – newtover

Questions connexes