/ / Mysql OPTIMIZE TABLE для всіх фрагментованих таблиць - mysql, оптимізація, фрагментація, дефрагментація

Mysql OPTIMIZE TABLE для всіх фрагментарних таблиць - mysql, оптимізація, фрагментація, дефрагментація

Я хотів би OPTIMIZE всі поточні фрагментовані таблиці. Ці таблиці повинні мати information_schema.DATA_FREE > 0.

Чи можна оптимізувати всі таблиці з цією властивістю в одній команді в SQL або мені доведеться писати зовнішній код для цього?

Відповіді:

37 для відповіді № 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;

1 для відповіді № 2

ok, це старий пост, але це потрібно.

Філ Дюфо 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 для відповіді № 3

Я знаю, що є відповідь. Але MySQL має таку рекомендацію для INNODB DB:

Це може прискорити сканування індексу, якщо ви періодично виконуєте “null” ALTER Операція TABLE, яка призводить до відновлення таблиці MySQL:

ALTER TABLE tbl_name ENGINE=INNODB

Знайдено тут http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html