繁体   English   中英

MySQL 优化所有表?

[英]MySQL OPTIMIZE all tables?

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

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

一个数据库:

mysqlcheck -o <db_schema_name>

所有数据库:

mysqlcheck -o --all-databases

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

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;

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

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

这个怎么运作

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

您可以通过在 var @tables_like设置不同的值来控制要优化的表(例如: set @tables_like = '%test%'; )。

以下示例 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());

   }
}

?>

使用一个简单的 shell 脚本执行所有必要的过程来修复所有数据库中的所有表:

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

对于所有数据库:

mysqlcheck -Aos -uuser -p 

对于一个数据库优化:

mysqlcheck -os -uroot -p dbtest3

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

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

运行后,系统将提示您输入 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

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

从 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>'

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

从命令行:

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

然后输入密码

您可以使用 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]

MySQL Administrator (MySQL GUI 工具的一部分)可以在数据库级别为您执行此操作。

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

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

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

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

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

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

这个 bash 脚本将接受 root 密码作为选项并对其进行一一优化,并带有状态输出:

#!/bin/bash

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
TBLLIST=""
COMMA=""
SQL="SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE"
SQL="${SQL} table_schema NOT IN ('information_schema','mysql','performance_schema')"
for DBTB in `mysql ${MYSQL_CONN} -ANe"${SQL}"`
do
    echo OPTIMIZE TABLE "${DBTB};"
    SQL="OPTIMIZE TABLE ${DBTB};"
    mysql ${MYSQL_CONN} -ANe"${SQL}"
done

用于列出和运行针对 DB 的工具的入门 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

我的 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

我的 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

如果本地版主允许这样做,我想推广我很久以前写的 PHP 库 - https://github.com/Simbiat/optimize-tables
该库的重点是允许根据表的参数和统计信息“智能”执行 OPTIMIZE、ANALYZE、CHECK 和 REPAIR 命令。 我已经在 CRON 中为https://simbiat.ru运行它超过 2 年了,它一直很顺利(当然,除了一些调整和小修复)。

为什么要使用这样的东西? 好吧,README 提供了更多详细信息,但简而言之,只有当您真正从中受益时,它才能帮助运行相关操作。 至少,它可以节省您的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM