使用MyISAM优化所有MySQL表

时间:2017-10-14 11:45:04

标签: mysql myisam

我在这里找到了很棒的文章http://www.empulsegroup.com/?p=342

但是当我尝试时:

root@vps:~# for i in `mysql -e 'select concat(table_schema,".",table_name) from information_schema.tables where engine="MyISAM"'`; do mysql -e "optimize table $i"; done
ERROR 1046 (3D000) at line 1: No database selected
  1. 你能给我一些使用它的例子吗?
  2. 如何优化--all-databases?
  3. 非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

使用-D or --database=...参数指定要用于mysql命令的数据库。

答案 1 :(得分:1)

尽管该文章中有声明,但您可能不需要经常运行优化表。它真的不会让查询运行得更快。

但是,让我们谈谈你得到的错误以及如何解决它。

查询的第一行输出不是表名,而是列标题,在本例中是您使用的表达式。

for i in `mysql -e 'select concat(table_schema,".",table_name) from information_schema.tables where engine="MyISAM"'`; 
do
  echo "$i";
done

输出:

concat(table_schema,".",table_name)
test.m

(我必须创建一个MyISAM表m,因为我没有正常使用MyISAM,我建议you should not use MyISAM either。)

如果您想跳过列标题,请使用-N--skip-column-names选项。

for i in `mysql -N -e 'select concat(table_schema,".",table_name) from information_schema.tables where engine="MyISAM"'`; 
do
  echo "$i";
done

输出:

test.m

您可能还想分隔架构和表名,因为任一名称都可能是保留字。

for i in `mysql -N -e 'select concat("\`",table_schema,"\`.\`",table_name,"\`") from information_schema.tables where engine="MyISAM"'`; 
do
  echo "$i";
done

输出:

`test`.`m`