MySQL OPTIMIZE所有表?

Ala*_*orm 233 mysql sql

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

Ike*_*ker 394

您可以mysqlcheck在命令行中执行此操作.

一个数据库:

mysqlcheck -o <db_schema_name>
Run Code Online (Sandbox Code Playgroud)

所有数据库:

mysqlcheck -o --all-databases
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在执行OPTIMIZE时,表格被锁定*,如果表格中包含大量数据,则可能需要很长时间.因此,在表进行OPTIMIZE时,不能插入或删除新记录.通常,优化生产系统的所有表不能被视为微不足道的操作. (32认同)
  • 简单使用:`mysqlcheck -u [用户名] -p [密码] -o [数据库名称]` (16认同)
  • 嗨@Gaia.不必要.在给定的时间表上优化所有表对每个人都没有好处.看看这篇文章,阅读有关此主题的深入思考的更多的评论比我能在有限的空间在这里提供:http://www.xaprb.com/blog/2010/02/07/how-often-应该-您使用,优化表/ (11认同)
  • 整套命令:http://www.thegeekstuff.com/2011/12/mysqlcheck/ (4认同)
  • @ No-Chip你可以使用`OPTIMIZE TABLE`命令优化MySQL客户端中的表:https://dev.mysql.com/doc/refman/5.5/en/optimize-table.html.例如,优化一个表如下:`OPTIMIZE TABLE <your_schema>.<your_table>;`,优化给定模式中的所有表,如下所示:`select concat('OPTIMIZE NO_WRITE_TO_BINLOG TABLE',table_schema,'.',table_name, ';')来自information_schema.tables的outfile'/tmp/optimize_all_tables.sql',其中table_schema ='pabeta'和table_type ='base table'; source /tmp/optimize_all_tables.sql;` (2认同)

Ism*_*uel 23

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

set @tables_like = null;
set @optimize = null;
set @show_tables = concat("show tables where", ifnull(concat(" `Tables_in_", database(), "` like '", @tables_like, "' and"), ''), " (@optimize:=concat_ws(',',@optimize,`Tables_in_", database() ,"`))");

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

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

set @show_tables = null, @optimize = null, @tables_like = null;
Run Code Online (Sandbox Code Playgroud)

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

注意:此代码不适用于phpmyadmin.

这个怎么运作

它运行一个show tables语句并将其存储在准备好的语句中.然后它optimize table在选定的集合中运行a .

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

  • 我的共享托管环境没有'mysqlchk'可用,所以我可以直接从'mysql'终端会话运行它.谢谢! (4认同)
  • @LorenzoBelfanti感谢您确认。令我高兴的是,即使经过2年,该代码也至少对10个人有用。对我来说,这是巨大的胜利!再次感谢您! (2认同)

Dmi*_*mov 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());

   }
}

?>
Run Code Online (Sandbox Code Playgroud)

  • 我想知道单独的查询方法是否有时更好.MySQL表示在OPTIMIZE TABLE运行时表被锁定.然后,一次优化每个服务器以让服务器在最短时间内获得锁定似乎更明智.显然这是一个被访问的服务器.如果没有,那么我认为单个查询是最好的方法. (8认同)
  • @Dean单独的查询方法通常更好地为实时应用程序提供喘息空间.事实上,我通常会为此目的添加延迟(仅750毫秒左右). (8认同)
  • 在具有200个表的数据库上,您将运行200个单独的查询,一次优化1个表.您应该将表名内存到一个字符串中,因此只需要一个优化表查询. (7认同)

小智 14

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

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
Run Code Online (Sandbox Code Playgroud)


小智 11

对于所有数据库:

mysqlcheck -Aos -uuser -p 
Run Code Online (Sandbox Code Playgroud)

对于一个数据库优化:

mysqlcheck -os -uroot -p dbtest3
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 11

如果要分析、修复和优化 MySQL 服务器中所有数据库中的所有表,可以从命令行一次性完成。不过,您将需要 root 来执行此操作。

mysqlcheck -u root -p --auto-repair --optimize --all-databases
Run Code Online (Sandbox Code Playgroud)

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

示例输出:

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
Run Code Online (Sandbox Code Playgroud)

如果您不知道 root 密码并且正在使用 WHM,您可以在 WHM 中更改它,方法是: 主页 > SQL 服务 > MySQL Root 密码


Fra*_*ank 6

从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>'
Run Code Online (Sandbox Code Playgroud)

然后,您可以将结果复制并粘贴到新查询中,或者从您自己的源中执行它。如果看不到整个语句: phpmyadmin中查看整个语句的方法


小智 5

从命令行:

mysqlcheck -o <db_name> -u<username> -p
Run Code Online (Sandbox Code Playgroud)

然后输入密码