使用MyISAM优化所有MySQL表

使用MyISAM优化所有MySQL表,mysql,myisam,Mysql,Myisam,我在这里找到了很棒的文章 但当我尝试时: 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 你能给我举个例子

我在这里找到了很棒的文章

但当我尝试时:

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
  • 你能给我举个例子吗
  • 如何优化--所有数据库

  • 非常感谢您的时间。

    您可以通过使用参数指定用于
    mysql
    命令的数据库。

    尽管有那篇文章中的陈述,您可能不需要经常运行optimize table。它确实不会使查询运行得更快

    但是,让我们来谈谈您遇到的错误以及如何修复它

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

    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
    
    test.m
    
    `test`.`m`
    
    (我必须创建一个名为MyISAM的表
    m
    ,因为我通常不使用MyISAM,我建议这样做。)

    如果要跳过列标题,请使用
    -N
    --跳过列名
    选项

    for i in `mysql -N -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
    
    test.m
    
    `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
    
    输出:

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