MySQL ОПТИМИЗИРУЕТ все таблицы?

220

MySQL имеет команду OPTIMIZE TABLE, которая может использоваться для восстановления неиспользуемого пространства в установке MySQL. Есть ли способ (встроенная команда или обычная хранимая процедура) для запуска этой оптимизации для каждой таблицы в базе данных и/или серверной установке, или это то, что вам нужно было бы script самостоятельно?

  • 10
    Будьте осторожны в том, что это не обязательно освободит место. Если вы используете InnoDB с одним файлом (вероятно, наиболее распространенной настройкой в наши дни), а не с отдельными файлами на таблицу, в конце вы все равно будете использовать тот же объем дискового пространства. На самом деле я видел, как он фактически использовал значительно больше дискового пространства, когда все было сказано и сделано. С большими столами стол может быть заблокирован на очень долгое время.
Теги:

13 ответов

329
Лучший ответ

Вы можете использовать mysqlcheck, чтобы сделать это в командной строке.

Одна база данных:

mysqlcheck -o <db_schema_name>

Все базы данных:

mysqlcheck -o --all-databases
  • 0
    Вы бы порекомендовали запуск этой команды хотя бы раз в месяц?
  • 10
    Привет @ Гая. Не обязательно. Оптимизация всех таблиц по заданному графику не выгодна для всех. Взгляните на этот пост и прочитайте комментарии, чтобы глубже изучить эту тему, чем я могу предоставить в ограниченном пространстве здесь: xaprb.com/blog/2010/02/07/…
Показать ещё 8 комментариев
19

Я сделал это "просто" script:

set @a=null,@c=null,@b=concat("show tables where",ifnull(concat(" `Tables_in_",database(),"` like '",@c,"' and"),'')," (@a:=concat_ws(',',@a,`Tables_in_",database(),"`))");

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

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

set @a=null,@b=null,@c=null;

Чтобы запустить его, просто вставьте его в любую SQL IDE, подключенную к вашей базе данных.

Примечание: этот код НЕ РАБОТАЕТ на phpmyadmin.

Как это работает

Он запускает оператор show tables и сохраняет его в подготовленном операторе. Затем он запускает optimize table в выбранном наборе.

Вы можете контролировать, какие таблицы следует оптимизировать, установив другое значение в var @c.

  • 3
    В моей среде общего хостинга нет «mysqlchk», поэтому я мог запустить его непосредственно из терминальной сессии «mysql». Спасибо!
  • 0
    Добро пожаловать. Я использую этот код для оптимизации 50 баз данных и провожу как можно меньше времени. Если вы думаете, что я могу улучшить код каким-либо образом, продолжайте и дайте мне свои предложения. Я буду рад улучшить этот драгоценный кусок кода.
Показать ещё 9 комментариев
14

В следующем примере php script может помочь вам оптимизировать все таблицы в вашей базе данных

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

   }
}

?>
  • 5
    В базе данных с 200 таблицами вы собираетесь выполнить 200 отдельных запросов, оптимизируя по 1 таблице за раз. Вы должны внедрить имена таблиц в одну строку, и, следовательно, требуется только один запрос оптимизации таблицы.
  • 8
    Интересно, лучше ли подход с отдельным запросом? MySQL говорит, что таблицы заблокированы во время работы OPTIMIZE TABLE. Тогда было бы разумнее оптимизировать каждую из них по очереди, чтобы позволить серверу получать блокировки в течение минимального времени. Очевидно это для сервера, к которому постоянно обращаются. Если нет, то я думаю, что один запрос является лучшим подходом.
Показать ещё 2 комментария
9

для всех баз данных:

mysqlcheck -Aos -uuser -p 

Для одной оптимизации базы данных:

mysqlcheck -os -uroot -p dbtest3
  • 0
    По крайней мере для меня, под Linux, команда mysqlcheck -Aos не требует user + пароль.
8

Выполняйте все необходимые процедуры для исправления всех таблиц во всех базах данных с помощью простой оболочки script:

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

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

Затем вы можете скопировать и вставить результат в новый запрос или выполнить его из собственного источника.

4

Вы можете оптимизировать/проверить и восстановить все таблицы базы данных с помощью клиента 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]
4

Из командной строки:

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

затем введите пароль

3

MySQL Administrator (часть MySQL GUI Tools) может сделать это для вас на уровне базы данных.

Просто выберите свою схему и нажмите кнопку Maintenance в правом нижнем углу.

Так как GUI Tools достигли статуса конца жизни, их трудно найти на странице mysql. Нашли их через Google: http://dev.mysql.com/downloads/gui-tools/5.0.html

Я не знаю, может ли это сделать и MySQL Workbench.

И вы можете использовать инструмент командной строки mysqlcheck, который тоже должен это сделать.

1

Если вы хотите анализировать, восстанавливать и оптимизировать все таблицы во всех базах данных вашего сервера 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

0

Стартер bash script для отображения и запуска инструмента против БД...

#!/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
0

Этот bash script будет принимать пароль 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
0

my 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню