Problème:
Existe-t-il un moyen de calculer le nombre d'octets occupés par la création de la table, je sais que vous pouvez obtenir des informations de information_schema.tables mais ces informations ne sont pas assez précises.
Ce qui est réellement requis est le nombre d'octets selon la définition de la table pour innodb uniquement et le classement pourrait également être considéré comme utf-8-general-ci
Par exemple, un test de table est le suivant
créer un test de table
(
col1 varchar (25),
col2 int,
col3 varchar (3),
col4 char (15),
col5 datetime
);
Maintenant, il faudrait connaître la taille totale des lignes qui peuvent être accumulées sur une ligne en fonction des types de colonnes du tableau.
J'ai trouvé une sorte de solution similaire dans MSSQL mais j'ai besoin de sa version MySQL
Script pour estimer la taille des lignes pour n'importe quelle table
Toute aide est très appréciée.
la source
Réponses:
Après beaucoup de réflexion et de recherche, nous avons trouvé une réponse qui a vraiment aidé à réaliser ce qui était requis. Il s'agit d'un script Perl et le lien de référence est
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
Merci à tous pour votre aide précieuse.
la source
-uUser -pPass
aux lignes de commande mysql et mysqldump dans le script (ou essayer à la--defaults-extra-file=/etc/mysql/debian.cnf
place sur Ubuntu / Debian) et l'exécuter avec une base de données comme premier argument commeperl test.pl mydatabase
Vous devez connaître la taille en octets de chaque champ en fonction du type de données ( référence MySQL ici ), puis résumer ces valeurs ensemble.
la source
Étape 1:
20 caractères anglais: 2 + 1 * 20
20 caractères moyen-orientaux / slaves: 2 + 2 * 20
20 caractères asiatiques: 2 + 3 * 20
20 caractères Emoji: 2 + 4 * 20 (et vous en avez besoin
utf8mb4
)Étape 2: ajoutez-les.
Étape 3: multipliez par quelque part entre 2 et 3 pour permettre la surcharge InnoDB. J'ai trouvé que ce facteur fonctionne généralement . (Mais pas pour les petites tables, et pas forcément bien pour les tables partitionnées.)
Je ne vois aucune raison de prendre la taille maximale de chaque colonne.
Vous pouvez vous rapprocher de
SHOW TABLE STATUS
ou lesinformation_schema
données équivalentes :Étape 1:
SELECT COUNT(*)
- utilisez-le à la place deRows
Étape 2: Obtenez
Data_length + Index_length + Data_free
Étape 3: divisez.
la source
SELECT AVG(LENGTH(varchar_col))
- Remarque:LENGTH
est déjà octets ; pas besoin de multiplier par 2/3/4. (CHAR_LENGTH
obtient la longueur en caractères.)J'ai créé un script bash approximatif pour calculer la taille des lignes et avertir s'il dépasse la limite basée sur le schéma:
La
la source
Il y a déjà quelques questions de ce type, par exemple celle-ci: Comment estimer / prédire la taille des données et la taille de l'index d'une table dans MySQL
Une différence entre cette question et votre table est la présence de chaînes de longueur variable dans la vôtre - n'oubliez pas de tenir compte de la taille maximale qu'elles peuvent être.
Rappelez-vous également qu'à partir de la version 5, il
varchar(25)
y a jusqu'à 25 caractères et pas jusqu'à 25 octets, donc si vous êtes susceptible de voir des caractères non ASCII dans vos chaînes, la taille de la colonne peut monter en flèche jusqu'à un maximum de 100 octets car certains caractères prennent quatre octets pour représenter - par exemple "tas d'emoji caca" (qui, je plaisante pas, existe) - si votre navigateur actuel + police le supporte, il ressemble à: 💩) est 0xF0 0x9F 0x92 0xA9. Avant la v5, MySQL comptait les octets et non les caractères lors de la spécification des longueurs de type de chaîne.Modifier concernant l'automatisation
En termes d'automatisation du processus, vous devriez pouvoir dériver toutes les informations nécessaires des
INFORMATION_SCHEMA
tables d'une manière similaire au script que vous avez trouvé pour MS SQL Server. Voir https://dev.mysql.com/doc/refman/5.0/en/information-schema.html pour une documentation couvrant cela.la source
INFORMATION_SCHEMA
tableaux doivent inclure les informations dont vous avez besoin. Voir dev.mysql.com/doc/refman/5.0/en/information-schema.html pour une documentation couvrant cela.