MySQL OPTIMIZE所有表?

时间:2011-03-29 15:01:33

标签: mysql sql

MySQL有一个OPTIMIZE TABLE命令,可用于回收MySQL安装中未使用的空间。有没有办法(内置命令或公共存储过程)为数据库和/或服务器安装中的每个表运行此优化,或者这是你必须自己编写脚本的东西?

15 个答案:

答案 0 :(得分:379)

您可以使用mysqlcheck在命令行执行此操作。

一个数据库:

mysqlcheck -o <db_schema_name>

所有数据库:

mysqlcheck -o --all-databases

答案 1 :(得分:21)

我制作了这个'简单'的脚本:

set @a=null,@c=null,@b=concat("show tables where",ifnull(concat(" `Tables_in_",database(),"` like '",@c,"' and"),'')," (@a:=concat_ws(',',@a,`Tables_in_",database(),"`))");

Prepare `bd` from @b;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;

set @a:=concat('optimize table ',@a);
PREPARE `sql` FROM @a;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;

set @a=null,@b=null,@c=null;

要运行它,只需将其粘贴到任何连接到数据库的SQL IDE中即可。

注意:此代码无法在phpmyadmin上运行

工作原理

它运行show tables语句并将其存储在预准备语句中。然后它在所选集合中运行optimize table

您可以通过在var @c中设置不同的值来控制要优化的表格。

答案 2 :(得分:18)

以下示例php脚本可以帮助您优化数据库中的所有表

<?php

dbConnect();

$alltables = mysql_query("SHOW TABLES");

while ($table = mysql_fetch_assoc($alltables))
{
   foreach ($table as $db => $tablename)
   {
       mysql_query("OPTIMIZE TABLE '".$tablename."'")
       or die(mysql_error());

   }
}

?>

答案 3 :(得分:11)

使用简单的shell脚本完成修复所有数据库中所有表的所有必要过程:

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze

答案 4 :(得分:10)

适用于所有数据库:

mysqlcheck -Aos -uuser -p 

对于一个数据库优化:

mysqlcheck -os -uroot -p dbtest3

答案 5 :(得分:5)

从命令行:

mysqlcheck -o <db_name> -u<username> -p

然后输入密码

答案 6 :(得分:5)

从phpMyAdmin和其他来源,你可以使用:

SET SESSION group_concat_max_len = 99999999;
SELECT GROUP_CONCAT(concat('OPTIMIZE TABLE `', table_name, '`;') SEPARATOR '') AS O
FROM INFORMATION_SCHEMA.TABLES WHERE 
TABLE_TYPE = 'BASE TABLE'
AND table_name!='dual'
AND TABLE_SCHEMA = '<your databasename>'

然后你可以复制&amp;将结果粘贴到新查询或从您自己的源执行。 如果你没有看到整个陈述: way to see whole statement in phpmyadmin

答案 7 :(得分:4)

您可以使用mysql客户端优化/检查和修复数据库的所有表。

首先,您应该获得所有表格列表,用','分隔:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'

现在,当您拥有所有要优化的表列表时:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]

答案 8 :(得分:3)

MySQL Administrator(MySQL GUI工具的一部分)可以在数据库级别为您完成。

只需选择您的架构,然后按右下角的Maintenance按钮。

由于GUI工具已达到寿命终止状态,因此很难在mysql页面上找到它们。通过Google找到它们:http://dev.mysql.com/downloads/gui-tools/5.0.html

我不知道新的MySQL Workbench是否也能做到这一点。

你可以使用mysqlcheck命令行工具,它也应该能够做到这一点。

答案 9 :(得分:2)

如果要分析,修复和优化MySQL服务器中所有数据库中的所有表,可以从命令行一次性完成。你需要root才能做到这一点。

mysqlcheck -u root -p --auto-repair --optimize --all-databases

运行后,系统将提示您输入MySQL root密码。在那之后,它将开始,你将看到它正在发生的结果。

示例输出:

yourdbname1.yourdbtable1       OK
yourdbname2.yourdbtable2       Table is already up to date
yourdbname3.yourdbtable3
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

etc..
etc...

Repairing tables
yourdbname10.yourdbtable10
warning  : Number of rows changed from 121378 to 81562
status   : OK

如果您不知道root密码并且正在使用WHM,则可以通过转到以下内容从WHM中更改它: 主页&gt; SQL服务&gt; MySQL Root密码

答案 10 :(得分:1)

我的 1 美分,添加了 and TABLE_TYPE='BASE TABLE' 以便我们可以跳过“VIEW”类型。

for table in `mysql -sss -e "select concat(table_schema,'.',table_name) from information_schema.tables where table_schema not in ('mysql','information_schema','performance_schema') and TABLE_TYPE='BASE TABLE' order by data_free desc;"`
do
mysql -e "OPTIMIZE TABLE $table;"
done

答案 11 :(得分:0)

此bash脚本将接受root密码作为选项并逐个优化,状态输出为:

package test;

import java.awt.Graphics;
import javax.swing.JApplet;

public class Test extends JApplet {       

    @Override
    public void paint(Graphics g) {
        g.drawString("Hello World!", 0, 0);
    }

    @Override
    public void init() {
        repaint();
    }

}

答案 12 :(得分:0)

一个入门bash脚本,用于列出并运行针对数据库的工具...

#!/bin/bash

declare -a dbs
unset opt

for each in $(echo "show databases;" | mysql -u root) ;do

        dbs+=($each)

done



echo " The system found [ ${#dbs[@]} ] databases." ;sleep 2
echo
echo "press 1 to run a check"
echo "press 2 to run an optimization"
echo "press 3 to run a repair"
echo "press 4 to run check,repair, and optimization"
echo "press q to quit"
read input

case $input in
        1) opt="-c"
        ;;
        2) opt="-o"
        ;;
        3) opt="-r"
        ;;
        4) opt="--auto-repair -c -o"
        ;;
        *) echo "Quitting Application .."; exit 7
        ;;
esac

[[ -z $opt ]] && exit 7;

echo " running option:  mysqlcheck $opt in 5 seconds  on all Dbs... "; sleep 5

for ((i=0; i<${#dbs[@]}; i++)) ;do
        echo "${dbs[$i]} : "
        mysqlcheck $opt ${dbs[$i]}  -u root
    done

答案 13 :(得分:0)

如果您直接访问数据库,则可以编写以下查询:

OPTIMIZE TABLE table1,table2,table3,table4......;

答案 14 :(得分:-1)

我的2cents:从具有最高碎片的表开始

for table in `mysql -sss -e "select concat(table_schema,".",table_name) from information_schema.tables where table_schema not in ('mysql','information_schema','performance_schema') order by data_free desc;"
do
mysql -e "OPTIMIZE TABLE $table;"
done