Mysql OPTIMIZE TABLE для всех фрагментированных таблиц

Я хотел бы OPTIMIZE все фрагментированные в настоящее время таблицы. Эти таблицы должны иметь information_schema.DATA_FREE > 0.

Можно ли оптимизировать все таблицы с этим свойством в одной команде в SQL или мне придется писать внешний код для этого?

Ответы

Ответ 1

Вы можете сделать что-то вроде этого:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";")
FROM tables
WHERE DATA_FREE > 0
INTO OUTFILE '/tmp/optimize.sql';
SOURCE '/tmp/optimize.sql';

В противном случае, если первый из них не работает, попробуйте:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";")
FROM information_schema.tables
WHERE DATA_FREE > 0
INTO OUTFILE '/tmp/optimize.sql';
SOURCE /tmp/optimize.sql;

Ответ 2

ok, это старый пост, но это необходимо.

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ написал замечательный script, то есть на github: https://github.com/pdufault/mysqlfragfinder/blob/master/mysqlfragfinder.sh

vim mysqlfragfinder.sh
#copy paste from github
chmod +x ./mysqlfragfinder.sh
./mysqlfragfinder.sh --user root_username --password root_password

и это все. Используете его на нескольких серверах какое-то время.

Ответ 3

Я знаю, что есть ответ. Но у MySQL есть эта рекомендация для БД INNODB:

Он может ускорить сканирование индексов, если вы периодически выполняете "нулевой" ALTER TABLE, что заставляет MySQL перестроить таблицу:

ALTER TABLE tbl_name ENGINE=INNODB

Найдено здесь http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html