Monday, January 24, 2011

Automatically optimize all tables in a MySQL database

Use this script preferably with a cronjob to automatically optimize all the tables in your database. Under root privilleges the script will search for all the databases in your server and will optimize them all.

Just change the connection variables ($h, $u, $p) and execute it from your browser.

Code:
<?phpecho '<pre>' "\n\n";set_time_limit100 );

  
$time microtime();
  
$time explode(' '$time);
  
$time $time[1] + $time[0];
  
$start $time;
  
//Connection variables :$h 'localhost';$u 'root';$p 'password';
$dummy_db 'mysql';
/*The php->mysql API needs to connect to a database even when executing scripts like this.
 If you got an error from this(permissions),
 just replace this with the name of your database*/
$db_link mysql_connect($h,$u,$p);
$res mysql_db_query($dummy_db'SHOW DATABASES'$db_link) or die('Could not connect: ' mysql_error());
echo 
'Found 'mysql_num_rows$res ) . ' databases' "\n";$dbs = array();
while ( 
$rec mysql_fetch_array($res) )
{
$dbs [] = $rec [0];
}

foreach ( 
$dbs as $db_name )
{
echo 
"Database : $db_name \n\n";$res mysql_db_query($dummy_db"SHOW TABLE STATUS FROM `" $db_name "`"$db_link) or die('Query : ' mysql_error());$to_optimize = array();
while ( 
$rec mysql_fetch_array($res) )
{
if ( 
$rec['Data_free'] > )
{
$to_optimize [] = $rec['Name'];
echo 
$rec['Name'] . ' needs optimization' "\n";
}
}
if ( 
count $to_optimize ) > )
{
foreach ( 
$to_optimize as $tbl )
{
mysql_db_query($db_name"OPTIMIZE TABLE `" $tbl ."`"$db_link );
}
}
}
$time microtime();
  
$time explode(' '$time);
  
$time $time[1] + $time[0];
  
$finish $time;
  
$total_time round(($finish $start), 6);
  echo 
'Parsed in ' $total_time ' secs' "\n\n";?>

0 comments:

Post a Comment

 
Design by Wordpress Theme | Bloggerized by Free Blogger Templates | free samples without surveys