2009-06-23 5 views
16

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

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

ответ

36

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

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; 
+9

незначительных изменений, необходимых для работы для меня, но большого подхода. 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; –

+0

Вам понадобятся некоторые обратные записи, расположенные вокруг table_schema и table_name, иначе я должен вам пиво, большое спасибо. –

1

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

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ написал сценарий удивительный, то есть на 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 

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

0

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

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

ALTER TABLE tbl_name ENGINE=INNODB

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