DÉTERMINER LA TAILLE D'UN BASE DE DONNÉES MYSQL ET LE NOMBRE D'ENREGISTREMENTS

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 23 nov. 2004 à 12:37
zulrigh Messages postés 24 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 7 juin 2014 - 26 juil. 2010 à 22:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27761-determiner-la-taille-d-un-base-de-donnees-mysql-et-le-nombre-d-enregistrements

zulrigh Messages postés 24 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 7 juin 2014
26 juil. 2010 à 22:53
tres simpa comme code !!! Merci !
skyg Messages postés 1 Date d'inscription vendredi 1 décembre 2006 Statut Membre Dernière intervention 29 avril 2008
29 avril 2008 à 14:14
Je ne trouve pas que que c'est une bonne idée de séparé le type d'unité et les unités.
Cette fonction marche pas mal du tout et rendra quelque chose d'exact.

function size_readable($size, $retstring = null)
{
$sizes = array('o', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo'); if ($retstring null) { $retstring '%01.2f %s'; }

$lastsizestring = end($sizes);
foreach ($sizes as $sizestring)
{
if ($size < 1024) { break; }
if ($sizestring != $lastsizestring) { $size /= 1024; }
}
if ($sizestring $sizes[0]) { $retstring '%01d %s'; } // Bytes ne sont pas fractionnaire normalement ...

return sprintf($retstring, $size, $sizestring);
}

Du coup, le code devient :
$rows = mysql_query("SHOW TABLE STATUS");
$dbSize = 0;
$dbrows = 0;
while ($row = mysql_fetch_array($rows))
{
$dbSize += $row['Data_length'] + $row['Index_length'];
$dbrows += $row['Rows'];
}
echo 'Taille de la base de données : '.size_readable($dbSize).' ('.$dbSize.' octets)

';
echo 'Nombre d\'enregistrements : '.$dbrows.' enregistrements

';

Cdt.
Sky
Utilisateur anonyme
9 janv. 2008 à 10:51
Et comment faire pour calculer le poids de toutes les bases de données appartenant à un seul utilisateur ?
cs_LysBleu Messages postés 1 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 28 septembre 2007
28 sept. 2007 à 21:42
rÉponse ;a
------------------------
query="SELECT COUNT(*) FROM MA_TABLE";
mon problème est comment mettre le resultat de cette requete dans une variable entière pour que je puisse l'utiliser dans une boucle for.
je veux la reponse le plus vite possible

et merci d'avance
--------------------------------

$query = "SELECT COUNT(*) as total FROM MA_TABLE";
$res = mysql_query( $query )
$row = mysql_fetch_object( $res )
$total = $row->total;
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
10 sept. 2006 à 02:05
Salut,

Une petite modification s'impose au niveau de la fonction file_size_info :

function file_size_info($filesize)
{
$bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

if ($filesize < 1024) $filesize = 1;

for ($i = 0; $filesize > 1024; $i++)
$filesize /= 1024;
$file_size_info['size'] = floor($filesize);
$file_size_info['deci'] = ceil(($filesize*1000)-(floor($filesize)*1000));
$file_size_info['type'] = $bytes[$i];
$file_size_info['type2'] = $bytes[$i-1];
return $file_size_info;
}

et pour l'affichage :

print "Taille de la base de données : {$dbSizeKo['size']} {$dbSizeKo['type']} et {$dbSizeKo['deci']} {$dbSizeKo['type2']} ($dbSize octets)
";

J'espère que c'est le résultat que tu cherches.

Bonne continuation.
cs_christobal Messages postés 208 Date d'inscription jeudi 3 octobre 2002 Statut Membre Dernière intervention 31 mars 2011
9 sept. 2006 à 20:39
bonjour et merci pour ce code que j'utilise depuis qq temps deja.

le poids de ma base évoluent j'aimerais avoir une affichage clair et préci de sa taile.

Aujourd'hui la taile ce fait en Mo, mais qu'elle face 1025 ou 2047 il affiche tj 2Mo.
J'aimerais qq chose du type 1.41 Mo ou 1Mo et 258 Ko.

Merci de votre aide
ilhembilto Messages postés 2 Date d'inscription dimanche 21 mai 2006 Statut Membre Dernière intervention 20 juin 2006
20 juin 2006 à 11:25
bjr!
je veux determiner le nombre d'enregistrement de ma table mysql en utilisant java.
j'ai utilisé la requete suivante:
query="SELECT COUNT(*) FROM MA_TABLE";
mon problème est comment mettre le resultat de cette requete dans une variable entière pour que je puisse l'utiliser dans une boucle for.
je veux la reponse le plus vite possible

et merci d'avance
Missions_courtes Messages postés 8 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 février 2006
16 mars 2005 à 18:44
Bonjour,
Voici ci-dessous un calcul pour déterminer la taille d'une base de données et le nombre total d'enregistrements

$rows = mysql_query("SHOW TABLE STATUS");
$dbSize = 0;
$dbrows = 0;

$Aff_screen .= "<table cellpadding=0 cellspacing=0 border=$Border class=td10> \n";

while ($row = mysql_fetch_array($rows))
{
$dbSize += $row['Data_length'] + $row['Index_length'];
$dbrows += $row['Rows'];
$Name = $row['Name'];
$Type = $row['Type'];
$Data_length = $row['Data_length'];
$Index_length = $row['Index_length'];
$nblignes = $row['Rows'];
$Create_time = $row['Create_time'];
$Update_time = $row['Update_time'];
if ( 1 == 2)
{
$Aff_screen .= "<tr> \n";
$Aff_screen .= "<td> DB </td>\n";
$Aff_screen . = "<td>   $dbSize </td>\n";
$Aff_screen .= "<td>     \$Name= $Name </td>\n";
$Aff_screen . = "<td>     \$Data_length= $Data_length </td>\n";
$Aff_screen . = "<td>     \$Index_length= $Index_length </td>\n";
$Aff_screen . = "<td>     \$nblignes= $nblignes </td>\n";
$Aff_screen . = "</tr> \n";
}
}

DB_Close ();


$dbSizeKo = file_size_info($dbSize);
$espace_db_Ko = $dbSizeKo['size'];
$espace_db_Ko = sprintf("%01.3f", $espace_db_Ko);

$espace_db_Mo = $espace_db_Ko / 1000 ;
$dbrows = $dbrows;

Cordialement.
Michel
NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
16 mars 2005 à 14:04
Oui, en effet. Mais c'est exactement ce que je cherchais à faire (cf mon avant-avant dernier commentaire du 15/03).

Ton code est très certainement utile mais pas dans mon cas.

Merci beaucoup pour tout ton aide.

@+
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
16 mars 2005 à 12:31
salut,


le code que tu as mentionné extrait le nombre d'enregistrements d'une seule table alors que mon code a pour but d'extraire le nombre d'enregistrements d'une base de données entières (plusieurs tables)

@+
NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
16 mars 2005 à 12:25
En cherchant un peu sur le web, g glané quelques codes dont celui-là:

//une fois connecté à la BDD :

$requete = mysql_query("select $nom_d'une colonne quelconque from $nom_de_la_table");
$nbr_user = mysql_numrows($requete);

apparement, ça fonctionne bien. Vaut-il mieu utiliser ton code à toi ou celui là ne pose aucun problème?

En tout cas merci de m'avoir aider.
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
16 mars 2005 à 11:44
n'oublis pas de changer :

$db_user = 'root'; // nom de l'utilisateur de la base
$db_pwd = 'pwd'; // Mot de passe
$db_name = 'bdd'; // nom de la base de données
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
16 mars 2005 à 11:40

<html>
<head>
<title>Taille Base de données MySQL</title>
</head>



<?php

$db_server = 'localhost';
$db_user = 'root';
$db_pwd = 'pwd';
$db_name = 'bdd';
$db_link = mysql_connect($db_server, $db_user, $db_pwd)    or exit('Could not connect: ' . mysql_error());
$db = mysql_select_db($db_name, $db_link)  or exit('Could not select database: ' . mysql_error());
// Déterminer le nombre d'enregistrements et la taille de la base de données en additionnant la taille de la table + la taille de l'index :
$rows = mysql_query("SHOW TABLE STATUS");
$dbrows = 0;
while ($row = mysql_fetch_array($rows))
{
$dbrows += $row['Rows'];
}
print "Nombre d'enregistrements : $dbrows enregistrements
";
?>

</html>


NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
15 mars 2005 à 13:25
Bonjour,
ton code m'interresse mais j'aimerai uniquement compter le nombre d'enregistrements et dans une table et non pas dans la base entière. Je suis débutant, quelqu'un pourrait m'aide svp.
Merci
Missions_courtes Messages postés 8 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 février 2006
1 déc. 2004 à 00:24
Bonjour hohorga,
Merci pour ta remarque for judicieuse : bien sur il faut mettre le " return $file_size_info;" après la boucle du FOR.

Mais après essai, pour une valeur initiale de 9404572 octets, return "$file_size_info" placé :
- dans la boucle du FOR : 9185 Ko,
- après la boucle du FOR : 9 Mo.

Les deux résultats sont justes.

Ceci dit si l'on souhaite : 9 Mo 185 Ko, il faudra revoir le code.

Cordialement
Michel FOUILLADE
hohorga Messages postés 4 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 30 novembre 2004
30 nov. 2004 à 23:45
Bonsoir Missions_courtes,

Je viens de tester ton code et il fonctionne.


Avec le code de JulioDelphi il y a bien une erreur et mes 33813 octets mon php 4.3.3 m'affiche bien 33MO ! C'est peut-être notre ami qui a mal corrigé (ou alors c'est que le code en haut de page http://www.phpcs.com/code.aspx?id=27761#code ne répercute pas les modifs et dans ce cas où le trouver ? (je rappelle je suis nouveau ici) ).

Sinon Missions_courtes je trouve un truc étrange à ton code : le return n'est-t-il pas mal placé ?

function file_size_info($filesize)
{
$bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

if ($filesize < 1024) $filesize = 1;

for ($i = 1; $filesize > 1024; $i++)
{
$filesize /= 1024;
$file_size_info['size'] = ceil($filesize);
$file_size_info['type'] = $bytes[$i];
return $file_size_info; ///// pourquoi ici et pas aprés la fin de boucle ???
}
}

Si je lis bien ton code la boucle tourne 1 seule fois puis retourne à l'appellant avec le return.

Je l'aurai vu plutôt comme ça (mais bon je n'utilise le php que pour les loisirs par pour le boulot, je ne suis donc pas expert dedans, donc ma correction viens peut-être de mon habitude du C) :


function file_size_info($filesize)
{
$bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

if ($filesize < 1024) $filesize = 1;

for ($i = 1; $filesize > 1024; $i++)
{
$filesize /= 1024;
$file_size_info['size'] = ceil($filesize);
$file_size_info['type'] = $bytes[$i];
}
return $file_size_info;
}



Bonsoir.
Missions_courtes Messages postés 8 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 février 2006
30 nov. 2004 à 21:10
Bonjour Hohorga,
Je ne voudrais pas avoir l'air de polémiquer, mais compte tenu de ce que dans ton exemple :
- dans la première boucle du for : $i = 0,
- la taille $filesize est divisé par 1024 (on a donc des ko),
- $bytes[$i] vaut "Octets" (pour $i = 0).

Alors que l'on devrait obtenir : $bytes[$i] vaut "Ko" .

Personnellement, j'aurai tendance à conserver :
" for ($i = 1; $filesize > 1024; $i++) "

C'est ce que j'ai "cablé sur mon site" et le résultat est correct.

Cordialement
Michel FOUILLADE
hohorga Messages postés 4 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 30 novembre 2004
30 nov. 2004 à 21:01
Une autre remarque mais pas sur ton code.

La taille calculée est celle des données pas la taille physique sur le(s) disque(s) dur(s). Ca peut avoir de l'intérêt si un hébergeur limite la taille, ou si c'est facturé.

Il serait donc intéressant (si c'est possible avec mysql) d'ajouter le calcul de la taille des indexes pour avoir une vue plus pointue de l'occupation physique.

La taille des indexes peut avoir une grosse importance car je connais des admin sous Oracle qui considèrent qu'une base qu'une base commence à être bien optimiosée si, entre autre, la taille des indexes est égale à environ 50% de la taille des indexes.
hohorga Messages postés 4 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 30 novembre 2004
30 nov. 2004 à 20:52
(Nouveau sur le site et je fait ma 1ère gaffe car plongé dans une erreur sur ton code : j'ai validé un post vide... Désolé !)

Sinon j'ai vu une erreur en testant sur une base quasi vide :
Taille de la base de données : 33 Mo (33521 octets)
Nombre d'enregistrements : 17 enregistrements

En fait dans $bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To'); l'index du tableau commence à zéro mais tu ne semble pas en avoir tenu compte.

Or ta boucle commence à l'index 1 :
for ($i = 1; $filesize > 1024; $i++)
$filesize /= 1024;

Le résultat est donc décalé (des KO sont affichés comme des MO)...

Je te recommande donc :

function file_size_info($filesize)
{
$bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

if ($filesize < 1024) $filesize = 1;

for ($i = 0; $filesize > 1024; $i++)
$filesize /= 1024;
$file_size_info['size'] = ceil($filesize);
$file_size_info['type'] = $bytes[$i];
return $file_size_info;
}


Voilà j'espère que ça fonctionnera mieux.

Et merci je vais utiliser ton code !
hohorga Messages postés 4 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 30 novembre 2004
30 nov. 2004 à 20:45
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
29 nov. 2004 à 11:20
Voilà correction faite.

Effectivement, 1 Ko = 1024 octets ( de 0 à 1023 ou de 1 à 1024). Et aussi la première valeur du tabelau est l'octet et non pas Kbits .

Trés observateur Missions_courtes ! Merci bcp.
Missions_courtes Messages postés 8 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 février 2006
29 nov. 2004 à 10:51
Bonjour frop01,
Tous d'abord pour ton outil : c'est super.

J'ai trouvé deux petites erreurs minimes :

Remplacer : $bytes = array('Kbit', 'Ko', 'Mo', 'Go', 'To');
Par : $bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

Remplacer : for ($i = 0; $filesize > 1024; $i++)
Par : for ($i = 1; $filesize > 1024; $i++)

Ce qui donne pour la fonction " file_size_info " :

function file_size_info($filesize)
{
$bytes = array('Octets', 'Ko', 'Mo', 'Go', 'To');

if ($filesize < 1024) $filesize = 1;

for ($i = 1; $filesize > 1024; $i++)
{
$filesize /= 1024;
$file_size_info['size'] = ceil($filesize);
$file_size_info['type'] = $bytes[$i];
return $file_size_info;
}
}

Je viens d'intégrer ton outil à mon menu d'administration de mon site.
Avec mes remerciements frop01.
Cordialement
Michel FOUILLADE
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
23 nov. 2004 à 14:07
Merci julio ;)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
23 nov. 2004 à 13:02
yes je sais bien :D "ton" code est bien, je lui mets 9/10 mais comme c pas ke de toi, je mets 8 ;p
bon codage :D
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
23 nov. 2004 à 12:57
Salut,

Si on mets cette boucle, on aura la liste des tables avec la taille des tables et non pas la taille de la base de données (somme des tailles).

Mais bon, avec la requête SHOW on peut toujours tiré plusieurs informations comme les tailles des pertes avec la somme du champ Data_free .

Merci ;)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
23 nov. 2004 à 12:37
change la boucle while finale par :

while ($row = mysql_fetch_array($rows)) {
$dbSize += $row['Data_length'] + $row['Index_length'];
print 'Table: ' . $row['Name'] . '
';
print 'Database size. . .: ' . $row['Data_length'] . '
';
print 'Index Size . . . .: ' . $row['Index_length'] . '
';
print 'Total size . . . .: ' . ($row['Data_length'] + $row['Index_length']) . '

';
}

ps : tiré de la meme url
Rejoignez-nous