MySQL optymalizuje wszystkie tabele?

MySQL posiada polecenie OPTIMIZE TABLE, które można wykorzystać do odzyskania nieużywanego miejsca w instalacji MySQL. Czy istnieje sposób (wbudowane polecenie lub wspólna procedura składowana), aby uruchomić tę optymalizację dla każdej tabeli w bazie danych i / lub instalacji serwera, czy jest to coś, co trzeba skrypt się samemu?

 254
Author: Alan Storm, 2011-03-29

15 answers

Możesz użyć mysqlcheck aby to zrobić w wierszu poleceń.

Jedna baza danych:

mysqlcheck -o <db_schema_name>

Wszystkie bazy danych:

mysqlcheck -o --all-databases
 429
Author: Ike Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 16:10:16

Zrobiłem ten' prosty ' skrypt:

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;

Aby go uruchomić, po prostu wklej go w dowolnym SQL IDE podłączonym do bazy danych.

Uwaga: Ten kod nie będzie działał na phpmyadmin.

Jak to działa

Uruchamia show tables oświadczenie i przechowuje je w przygotowanym oświadczeniu. Następnie uruchamia optimize table w wybranym zestawie.

Możesz kontrolować, które tabele optymalizować, ustawiając inną wartość w var @tables_like (np.: set @tables_like = '%test%';).

 30
Author: Ismael Miguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-06 11:15:43

Poniższy przykładowy skrypt php może pomóc w optymalizacji wszystkich tabel w bazie danych

<?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());

   }
}

?>
 20
Author: Scherbius.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 15:08:28

Wykonaj wszystkie procedury niezbędne do ustalenia wszystkich tabel we wszystkich bazach danych za pomocą prostego skryptu powłoki:

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
 15
Author: Ivan Velkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 11:52:03

Dla wszystkich baz danych:

mysqlcheck -Aos -uuser -p 

Dla jednej optymalizacji bazy danych:

mysqlcheck -os -uroot -p dbtest3
 11
Author: Muni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 11:54:54

Jeśli chcesz analizować, naprawiać i optymalizować wszystkie tabele we wszystkich bazach danych na serwerze MySQL, możesz to zrobić za jednym razem z linii poleceń. Będziesz musiał root, aby to zrobić.

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

Po uruchomieniu zostanie wyświetlony monit o podanie hasła głównego MySQL. Następnie rozpocznie się i zobaczysz wyniki, Jak to się dzieje.

Przykładowe wyjście:

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

Jeśli nie znasz hasła roota i używasz WHM, możesz zmienić je z poziomu WHM, przechodząc do: Home > SQL Services > MySQL root Password

 9
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 21:34:57

Z phpMyAdmin i innych źródeł możesz użyć:

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

Następnie możesz skopiować i wkleić wynik do nowego zapytania lub wykonać go z własnego źródła. Jeśli nie widzisz całej wypowiedzi: sposób na zobaczenie całej instrukcji w phpmyadmin

 9
Author: Frank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-17 10:48:55

Z linii poleceń:

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

Następnie wpisz hasło

 5
Author: si le,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 15:18:36

Możesz zoptymalizować / sprawdzić i naprawić wszystkie tabele bazy danych, używając klienta mysql.

Najpierw należy pobrać listę wszystkich tabel, oddzieloną',':

mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'

Teraz, gdy masz listę wszystkich tabel do optymalizacji:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]
 4
Author: Victor Driantsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-02 08:47:10

MySQL Administrator (część narzędzi GUI MySQL) może to zrobić za Ciebie na poziomie bazy danych.

Wystarczy wybrać schemat i nacisnąć przycisk Maintenance W prawym dolnym rogu.

Ponieważ narzędzia GUI osiągnęły status końca życia, trudno je znaleźć na stronie mysql. Znaleziono je przez Google: http://dev.mysql.com/downloads/gui-tools/5.0.html

Nie wiem, czy nowy MySQL Workbench też może to zrobić.

I możesz użyć narzędzia linii poleceń mysqlcheck, które to też powinno być w stanie zrobić.

 3
Author: Jürgen Steinblock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 15:42:40

Jeśli uzyskujesz bezpośredni dostęp do bazy danych, możesz napisać następujące zapytanie:

OPTIMIZE TABLE table1,table2,table3,table4......;
 2
Author: Anand agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 05:45:17

Ten skrypt bash zaakceptuje hasło roota jako opcję i zoptymalizuje je jeden po drugim, z wyjściem stanu:

#!/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
 1
Author: rubo77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 10:07:58

Skrypt startowy bash do wyświetlania i uruchamiania narzędzia przeciwko DBs...

#!/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
Author: Mike Q,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 02:40:03

Mój 1 cent, dodany {[1] } , więc możemy pominąć typ " 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
 1
Author: Radoslaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-19 16:59:25

My 2cents: start with table with highest fragmentation

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
 0
Author: DBHash.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 16:42:10