Avatar billede martinbk Nybegynder
14. juni 2003 - 05:04 Der er 16 kommentarer og
1 løsning

størrelse på SQL tabel

hejsa E!
findes der en metode hvorved man kan bestemme størrelsen på sin SQL database, og evt. også på enkelte tabeller i databasen.. et lille eks. ville være guld :)
Avatar billede the-ultimate Nybegynder
14. juni 2003 - 08:29 #1
Hmm..
En database består jo af tabeller og rækker. Du kan bruge phpmyadmin til at se dine databaser grafisk. Umilbart skulle jeg ikke mene at der er et php script der kan skrive størrelsen i kb/mb hvis det er det du mener.. der kan du eventuelt tjekke den database fil du kan finde på din maskine (mysql) eller på webserveren. Dette er en usikker måde at gøre det på, for der kan være alle mulige andre databaser den bliver ref. til/fra. :-S

Hvis jeg ikke har fået besvaret det godt nok.. skal du bare sige til, og forklar nærmere. Så skal jeg nok svare dig..
Avatar billede martinbk Nybegynder
14. juni 2003 - 11:04 #2
efter hvad jeg kan se har phpmyadmin netop et sådan script der kan give mig størrelsen på en tabel i min database og endelig ligge samtlige tabeller i en database sammen
Avatar billede martinbk Nybegynder
14. juni 2003 - 11:10 #3
har fundet følgende kode i phpmyadmin's tbl_properties_structure.php


<?php
/**
* Displays Space usage and row statistics
*/
// BEGIN - Calc Table Space - staybyte - 9 June 2001
// loic1, 22 feb. 2002: updated with patch from
//                      Joshua Nye <josh at boxcarmedia.com> to get valid
//                      statistics whatever is the table type
if ($cfg['ShowStats']) {
    $nonisam    = FALSE;
    $is_innodb = (isset($showtable['Type']) && $showtable['Type'] == 'InnoDB');
    if (isset($showtable['Type']) && !eregi('ISAM|HEAP', $showtable['Type'])) {
        $nonisam = TRUE;
    }
    if (PMA_MYSQL_INT_VERSION >= 32303 && ($nonisam == FALSE || $is_innodb)) {
        // Gets some sizes
        $mergetable    = FALSE;
        if (isset($showtable['Type']) && $showtable['Type'] == 'MRG_MyISAM') {
            $mergetable = TRUE;
        }
        list($data_size, $data_unit)        = PMA_formatByteDown($showtable['Data_length']);
        if ($mergetable == FALSE) {
            list($index_size, $index_unit)  = PMA_formatByteDown($showtable['Index_length']);
        }
        if (isset($showtable['Data_free']) && $showtable['Data_free'] > 0) {
            list($free_size, $free_unit)    = PMA_formatByteDown($showtable['Data_free']);
            list($effect_size, $effect_unit) = PMA_formatByteDown($showtable['Data_length'] + $showtable['Index_length'] - $showtable['Data_free']);
        } else {
            list($effect_size, $effect_unit) = PMA_formatByteDown($showtable['Data_length'] + $showtable['Index_length']);
        }
        list($tot_size, $tot_unit)          = PMA_formatByteDown($showtable['Data_length'] + $showtable['Index_length']);
        if ($table_info_num_rows > 0) {
            list($avg_size, $avg_unit)      = PMA_formatByteDown(($showtable['Data_length'] + $showtable['Index_length']) / $showtable['Rows'], 6, 1);
        }

        // Displays them
        ?>

    <!-- Space usage -->
    <td width="20">&nbsp;</td>
    <td valign="top">
        <?php echo $strSpaceUsage . '&nbsp;:' . "\n"; ?>
        <a name="showusage"></a>
        <table border="<?php echo $cfg['Border']; ?>">
        <tr>
            <th><?php echo $strType; ?></th>
            <th colspan="2" align="center"><?php echo $strUsage; ?></th>
        </tr>
        <tr>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" style="padding-right: 10px"><?php echo $strData; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" align="right" nowrap="nowrap"><?php echo $data_size; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>"><?php echo $data_unit; ?></td>
        </tr>
        <?php
        if (isset($index_size)) {
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" style="padding-right: 10px"><?php echo $strIndex; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" align="right" nowrap="nowrap"><?php echo $index_size; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>"><?php echo $index_unit; ?></td>
        </tr>
            <?php
        }
        if (isset($free_size)) {
            echo "\n";
            ?>
        <tr style="color: #bb0000">
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" style="padding-right: 10px"><?php echo $strOverhead; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>" align="right" nowrap="nowrap"><?php echo $free_size; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorTwo']; ?>"><?php echo $free_unit; ?></td>
        </tr>
        <tr>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>" style="padding-right: 10px"><?php echo $strEffective; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>" align="right" nowrap="nowrap"><?php echo $effect_size; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>"><?php echo $effect_unit; ?></td>
        </tr>
            <?php
        }
        if (isset($tot_size) && $mergetable == FALSE) {
            echo "\n";
        ?>
        <tr>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>" style="padding-right: 10px"><?php echo $strTotalUC; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>" align="right" nowrap="nowrap"><?php echo $tot_size; ?></td>
            <td bgcolor="<?php echo $cfg['BgcolorOne']; ?>"><?php echo $tot_unit; ?></td>
        </tr>
            <?php
        }
        // Optimize link if overhead
        if (isset($free_size) && ($tbl_type == 'MYISAM' || $tbl_type == 'BDB')) {
            echo "\n";
            ?>
        <tr>
            <td colspan="3" align="center">
                [<a href="sql.php?<?php echo $url_query; ?>&amp;pos=0&amp;sql_query=<?php echo urlencode('OPTIMIZE TABLE ' . PMA_backquote($table)); ?>"><?php echo $strOptimizeTable; ?></a>]
            </td>
        </tr>
            <?php
        }
        echo "\n";
        ?>
        </table>
    </td>

    <!-- Rows Statistic -->
    <td width="20">&nbsp;</td>
    <td valign="top">
        <?php echo $strRowsStatistic . '&nbsp;:' . "\n"; ?>
        <table border="<?php echo $cfg['Border']; ?>">
        <tr>
            <th><?php echo $strStatement; ?></th>
            <th align="center"><?php echo $strValue; ?></th>
        </tr>
        <?php
        $i = 0;
        if (isset($showtable['Row_format'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strFormat; ?></td>
            <td bgcolor="<?php echo $bgcolor; ?>" align="<?php echo $cell_align_left; ?>" nowrap="nowrap">
            <?php
            echo '                ';
            if ($showtable['Row_format'] == 'Fixed') {
                echo $strFixed;
            }
            else if ($showtable['Row_format'] == 'Dynamic') {
                echo $strDynamic;
            }
            else {
                echo $showtable['Row_format'];
            }
            echo "\n";
            ?>
            </td>
        </tr>
            <?php
        }
        if (!$is_innodb && isset($showtable['Rows'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strRows; ?></td>
            <td bgcolor="<?php echo $bgcolor; ?>" align="right" nowrap="nowrap">
                <?php echo number_format($showtable['Rows'], 0, $number_decimal_separator, $number_thousands_separator) . "\n"; ?>
            </td>
        </tr>
            <?php
        }
        if (!$is_innodb && isset($showtable['Avg_row_length']) && $showtable['Avg_row_length'] > 0) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strRowLength; ?>&nbsp;&oslash;</td>
            <td bgcolor="<?php echo $bgcolor; ?>" align="right" nowrap="nowrap">
                <?php echo number_format($showtable['Avg_row_length'], 0, $number_decimal_separator, $number_thousands_separator) . "\n"; ?>
            </td>
        </tr>
            <?php
        }
        if (!$is_innodb && isset($showtable['Data_length']) && $showtable['Rows'] > 0 && $mergetable == FALSE) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strRowSize; ?>&nbsp;&oslash;</td>
            <td bgcolor="<?php echo $bgcolor; ?>" align="right" nowrap="nowrap">
                <?php echo $avg_size . ' ' . $avg_unit . "\n"; ?>
            </td>
        </tr>
            <?php
        }
        if (isset($showtable['Auto_increment'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strNext; ?>&nbsp;Autoindex</td>
            <td bgcolor="<?php echo $bgcolor; ?>" align="right" nowrap="nowrap">
                <?php echo number_format($showtable['Auto_increment'], 0, $number_decimal_separator, $number_thousands_separator) . "\n"; ?>
            </td>
        </tr>
            <?php
        }
        echo "\n";

        if (isset($showtable['Create_time'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strStatCreateTime; ?></td>
            <td style="font-size: <?php echo $font_smaller; ?>" align="right" bgcolor="<?php echo $bgcolor; ?>" nowrap="nowrap">
                <?php echo PMA_localisedDate(strtotime($showtable['Create_time'])) . "\n"; ?>
            </td>
        </tr>
                <?php
        }
        echo "\n";

        if (isset($showtable['Update_time'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strStatUpdateTime; ?></td>
            <td style="font-size: <?php echo $font_smaller; ?>" align="right" bgcolor="<?php echo $bgcolor; ?>" nowrap="nowrap">
                <?php echo PMA_localisedDate(strtotime($showtable['Update_time'])) . "\n"; ?>
            </td>
        </tr>
                <?php
        }
        echo "\n";

        if (isset($showtable['Check_time'])) {
            $bgcolor = ((++$i%2) ? $cfg['BgcolorTwo'] : $cfg['BgcolorOne']);
            echo "\n";
            ?>
        <tr>
            <td bgcolor="<?php echo $bgcolor; ?>"><?php echo $strStatCheckTime; ?></td>
            <td style="font-size: <?php echo $font_smaller; ?>" align="right" bgcolor="<?php echo $bgcolor; ?>" nowrap="nowrap">
                <?php echo PMA_localisedDate(strtotime($showtable['Check_time'])) . "\n"; ?>
            </td>
        </tr>
            <?php
        }
        echo "\n";
        ?>
        </table>
    </td>
        <?php
    }
}
// END - Calc Table Space


eneste problem er jeg ikke rigtig forstår denne kode
Avatar billede mart1n Nybegynder
14. juni 2003 - 11:11 #4
SHOW TABLE STATUS LIKE 'tabel'
Avatar billede martinbk Nybegynder
14. juni 2003 - 11:21 #5
iflg. MySQL manualen (ref. http://www.mysql.com/doc/en/SHOW_TABLE_STATUS.html) giver table status ikke nogen form for størrelses angivelse det giver en række angivelse, det mest brugbare er længden på datafilen... men langt fra hvad jeg søgte
Avatar billede mart1n Nybegynder
14. juni 2003 - 11:35 #6
http://www.mysql.com/doc/en/Table_size.html

"You can check the maximum table size for a table with the SHOW TABLE STATUS command".
Avatar billede mart1n Nybegynder
14. juni 2003 - 11:37 #7
Så går jeg ud fra at man også kan få den nuværende størrelse der.
Avatar billede mart1n Nybegynder
14. juni 2003 - 11:38 #8
Og hvis du kigger i phpMyAdmin, så har de regnet det ud med Data_length + Index_length.
Avatar billede detox Nybegynder
14. juni 2003 - 11:39 #9
Ja, hvis du bruger SHOW TABLE STATUS FROM database kan du lægge data_length og index_lenght sammen, så har du tabellens størrelse.
Avatar billede the-ultimate Nybegynder
14. juni 2003 - 14:17 #10
Jo, men så er vi over i SQL.
Det jeg tænkte på var et phpscript der beregnede dette. Det kan saktens lade sig gøre med SQL. Men så skal du til at opsætte et script i SQL midt i din php test side. Hvis du altså ikke køre sql'en direkte i databasen. Du kan jo altid tjekke hvad du kan/vil lave i SQL. Uden sql kommer du ikke langt inden for php. Så hvis du ikke kan det må du hellere se at lære det.. En god dansk begyndervejledning kan man finde på http://www.webcafe.dk

Du behøver langt fra hele det script du skrev der. Jeg er i stand til at se hvad pokker det gør.. Jo det er da effectivt hvis du vil havde af vide hvad klokken er.. Opret klokkeslet. Tjek det og skriv det osv.. Ja det burde tjekke størrelsen på din database meeeen.. størrelser på en database er et svært begreb..

Køre du på localhost? Ellers hjælper det ikke at du/i læser mysql manualer.
Måske understøtter hosting stedet mysql meen det er ikke en mysql server som den der køre på ens egen computer. De bruger nogle andre programmer og metoder til at afvikle SQL. De har databaserne i creater men på en anden måde en i har som localhost. Stedet som b-one bruge mysql server. De køre på localhost så der virker mysql manualerne.. (den viden) selvfølgelig kan man da se på den sql der bliver benyttet men måske bliver der brugt nogle genveje som kun kompailes rigtigt af mysql og ikke en web sql server.

Prøv bare med dit php script. Det er bedst ikke at pille i det hvis du ikke forstår betydningen. Så kommer du måske til at fjerne noget som skal være der. Men try it... Det ser fornuftigt nok ud når vi ser bort fra de små unødvendige ting som hvad klokkeslet handlingen blev udført.. Men mindre man skal havde en total log osv.. Har jeg på min web hosting server meen det har sku ikke noget med emnet at gøre...
Avatar billede detox Nybegynder
14. juni 2003 - 14:57 #11
Jeg har kogt det ned til følgende:
.................................
$db = "database";
$query ="SHOW TABLE STATUS FROM " . $db;
$result = mysql_query($query)
            or die(mysql_error());

if (@mysql_num_rows($result)) {
                while ($row = mysql_fetch_array($result)) {
                    $dbs_array[$db][1] += $row['Data_length'];
                    $dbs_array[$db][2] += $row['Index_length'];
                }
                $dbs_array[$db][3]    = $dbs_array[$db][1] + $dbs_array[$db][2];
                $total_array[1]        += $dbs_array[$db][1];
                $total_array[2]        += $dbs_array[$db][2];
                $total_array[3]        += $dbs_array[$db][3];
            } // end if
mysql_close($conn);
$bytes = $total_array[3];
$kb = $bytes/1024;
$mb = $kb/1024;
print "$db database indeholder ialt: $bytes bytes</br>";
print "$db database indeholder ialt: $kb kilobytes</br>";
print "$db database indeholder ialt: $mb megabytes</br>";
.........................................................
som giver den samlede størrelse på en database ($db).
Det skulle så være overskueligt at ændre, hvis du vil have størrelsen på de enkelte tabeller.
Avatar billede the-ultimate Nybegynder
14. juni 2003 - 19:04 #12
hmm der var du lige hurtiger end jeg var.. havde faktisk lavet den samme kogning... :)
Avatar billede martinbk Nybegynder
16. juni 2003 - 05:43 #13
detox din kode virke skam, synes bare ikke rigtig det virker specielt logisk hvordan jeg kan ændre den til at kigge på tabeller istedet for hele databaser

kan godt se du får $total_array til at indeholde størrelsen af data_length og index_length lagt sammen men hvad skal man "skrue" på for at få vist en bestemt tabel ?
Avatar billede detox Nybegynder
16. juni 2003 - 11:12 #14
Sådan her kan du få listet hver enkelt tabel:
---------------------------------------------
$db = 'database';
$str = "<h1>Database $db:</h1></br>";
$query ="SHOW TABLE STATUS FROM " . $db;
$result = mysql_query($query)
            or die(mysql_error());

if (@mysql_num_rows($result)) {
                while ($row = mysql_fetch_array($result)) {
          $tabelnavn = $row['Name'];
                  $data = $row['Data_length'];
                  $index = $row['Index_length'];
          $ialt = number_format(($data+$index)/1024,2,',','.');
          $str .= "$tabelnavn indeholder $ialt kb </br>";
                }
            } // end if
// spyt ud
print $str;
Avatar billede detox Nybegynder
16. juni 2003 - 11:27 #15
Hvis du bare vil ha' en enkelt tabel (eller flere matchende) kan du bruge LIKE.
------------------
$db = 'database';
$tabel = 'tabel';
$str = "<h1>Database $db:</h1></br>";
$query ="SHOW TABLE STATUS FROM $db LIKE '$tabel'" ;
$result = mysql_query($query)
            or die(mysql_error());

if (@mysql_num_rows($result)) {
                while ($row = mysql_fetch_array($result)) {
                    $tabelnavn = $row['Name'];
                    $data = $row['Data_length'];
                    $index = $row['Index_length'];
                    $ialt = number_format(($data+$index)/1024,2,',','.');
                    $str .= "$tabelnavn indeholder $ialt kb </br>";
                }
            } // end if
// spyt ud
print $str;
Avatar billede martinbk Nybegynder
13. juli 2003 - 22:42 #16
detox, jeg har lige kigget på dine løsninger og det virker fremragende, smid lige et svar :)
Avatar billede detox Nybegynder
13. juli 2003 - 23:15 #17
c",)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester