2012-06-03 42 views
1

我想優化日常統計工作所需的索引大小,這樣我就可以減少表的大小並使日常統計工作更慢一些。如何獲得MySQL中每個索引的大小

爲了做到這一點,我想在表格中得到每個索引的大小。

"show table status from"只顯示Index_length這是表中所有指數的總大小。

有沒有辦法檢索表中每個標記的大小?

回答

0

對於指標的選擇,你可以按照this

因此,在PHP SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

+0

已經l在show table語句語法中使用了ooked,但似乎無法使用它獲取每個索引的大小。 – curinno

+0

@curinno在我鏈接你的頁面中,是寫相反的....這很奇怪。 – DonCallisto

1

例如:

<?php 
error_reporting(E_ERROR | E_PARSE | E_COMPILE_ERROR); 

$c = mysql_connect('localhost', 'user_root', 'user_root_pass'); 

function filesize_($size=0, $round=2){ 
     $type = array('bytes', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'); 
     for ($i=0; $size>1024; $size=$size/1024){$i++;} 
     if(empty($i)){$i='0';} 
     return round($size, $round).' '.$type[$i]; 
} 

if(!$c){ 
    echo 'mysql not found: '.__FILE__; exit; 
} 
$sum = array(); 
$sql = 'SHOW DATABASES'; 
if($q = mysql_query('SHOW DATABASES')){ 
     $a = array(); 
     while($r = mysql_fetch_row($q)){ 
       $a[] = $r['0']; 
     } 
     foreach($a as $name){ 
       $sql = 'error select db: '.$name; 
       if(@mysql_select_db($name, $c) ){ 
         $sql = 'error SHOW TABLE STATUS: '.$name; 
         if($q = mysql_query('SHOW TABLE STATUS')){ 
           while($r = mysql_fetch_assoc($q)){ 
             $sum[ $r['Engine'] ] += $r['Index_length']; 
           } 
         }else{ 
           echo $sql."\n"; 
         } 
       }else{ 
         echo $sql."\n"; 
       } 
     } 
}else{ 
     echo 'error:'.$sql; 
} 
echo 'Engine indexes sum:'."\n"; 
foreach($sum as $engine => $count){ 
     echo $engine."\t".filesize_($count)."\n"; 
} 
echo 'thats all.'."\n"; 

查看結果腳本運行,例如:PHP this_script.php 和你得到結果:

Engine indexes sum: 
MEMORY 0 bytes 
MyISAM 6.84 Gb 
InnoDB 416 Kb 
CSV 0 bytes 
thats all.