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