Mysql OPTIMIZE TABLE для всех фрагментированных таблиц - PullRequest
16 голосов
/ 23 июня 2009

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

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

Ответы [ 3 ]

37 голосов
/ 23 июня 2009

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

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;
1 голос
/ 09 апреля 2012

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

Фил Дюфо 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 голосов
/ 09 октября 2013

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

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

ALTER TABLE tbl_name ENGINE=INNODB

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

...