MySQL ОПТИМИЗИРУЕТ все таблицы? - PullRequest
225 голосов
/ 29 марта 2011

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

Ответы [ 14 ]

383 голосов
/ 29 марта 2011

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

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

mysqlcheck -o <db_schema_name>

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

mysqlcheck -o --all-databases
22 голосов
/ 28 февраля 2014

Я сделал этот «простой» скрипт:

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, подключенную к вашей базе данных.

Примечание: этот код WON'T работает на phpmyadmin.

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

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

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

18 голосов
/ 29 марта 2011

Следующий пример сценария 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());

   }
}

?>
12 голосов
/ 30 мая 2014

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

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
10 голосов
/ 08 октября 2013

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

mysqlcheck -Aos -uuser -p 

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

mysqlcheck -os -uroot -p dbtest3
5 голосов
/ 15 октября 2015

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

Затем вы можете скопировать и вставить результат в новый запрос или выполнить его из вашего собственного источника.Если вы не видите всего утверждения: way to see whole statement in phpmyadmin

5 голосов
/ 18 февраля 2013

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

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

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

4 голосов
/ 02 октября 2013

Вы можете оптимизировать / проверить и восстановить все таблицы базы данных, используя клиент 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]
3 голосов
/ 24 февраля 2016

Если вы хотите анализировать, восстанавливать и оптимизировать все таблицы во всех базах данных на сервере MySQL, вы можете сделать это за один раз из командной строки. Для этого вам понадобится root.

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

После того, как вы запустите это, вам будет предложено ввести пароль root для 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: Home> SQL Services> MySQL Root Password

3 голосов
/ 29 марта 2011

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

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

Поскольку инструменты с графическим интерфейсом достигли состояния окончания срока службы, их трудно найти на странице mysql.Нашел их через Google: http://dev.mysql.com/downloads/gui-tools/5.0.html

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...