MySQL有一个OPTIMIZE TABLE命令,可以用来回收MySQL安装中未使用的空间。是否有一种方法(内置命令或通用存储过程)可以为数据库和/或服务器安装中的每个表运行这种优化,还是必须自己编写脚本?
当前回答
您可以在命令行中使用mysqlcheck来完成此操作。
一个数据库:
mysqlcheck -o <db_schema_name>
所有数据库:
mysqlcheck -o --all-databases
其他回答
MySQL管理员(MySQL GUI工具的一部分)可以在数据库级别为你做这些。
只需选择您的模式并按下右下角的Maintenance按钮。
由于GUI工具已经达到了生命结束的状态,他们很难在mysql页面上找到。通过谷歌:http://dev.mysql.com/downloads/gui-tools/5.0.html找到他们
我不知道新的MySQL Workbench是否也能做到这一点。
您可以使用mysqlcheck命令行工具,它也应该能够做到这一点。
我的1美分,添加和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
下面的示例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());
}
}
?>
我的建议是:从碎片率最高的表开始
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
如果你是直接访问数据库,那么你可以写以下查询:
OPTIMIZE TABLE table1,table2,table3,table4......;
推荐文章
- 如何关闭mysql密码验证?
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- MySQL区分大小写查询
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- MySQL数据库表中的最大记录数
- 原则-如何打印出真正的sql,而不仅仅是准备好的语句?
- PHP/MySQL插入一行然后获取id
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N