Під час використання базами даних ми постійно змінюємо їх вміст. Щось видаляємо, додаємо або оновлюємо - у будь-якому випадку нові дані перезаписувати, старі видаляються. В результаті отримуємо дефрагментірован таблиці що врешті-решт може позначитися на швидкодії бази даних. Метод оптимізації таких таблиць відомий давно команда optimize table в MySQL. Однак команда не призначена для оптімізціі всіх або множинних таблиць. Тому доводиться проводити маніпуляції для кожної таблиця окремо. Однак якщо таких таблиць багато - то це вже важко. В Інтернеті досить багато скриптів, які дозволяють спростити цю роботу. Тут наводиться один з таких перероблених скриптів, який враховує ряд факторів. Таблиці в пам'яті не вимагають дефрагментації, а таблиці InnoDB не підтримують такий підхід. Плюс як правило піддають оптимізації все таблиці, у яких фрагментація більше 0 - тобто навіть ті, у яких фрагментировано 1%. Звичайно, на великих таблицях це може мати значення - але в ряді випадків краще задати поріг оптимізації. Нижче наводиться сам по собі сріпт:
#! / Bin / sh
echo -n "MySQL username:"; read username
echo -n "MySQL password:"; stty -echo; read password; stty echo; echo
optimize_limit = 5
mysql -u $ username -p "$ password" -NBe "SHOW DATABASES;" | grep -v 'lost + found' | while read database; do
if [ "$ database" = "mysql"] || [ "$ Database" = "information_schema"]; then continue; fi
mysql -u $ username -p "$ password" -NBe "SHOW TABLE STATUS;" $ Database |
while read name engine version rowformat rows avgrowlength datalength maxdatalength indexlength datafree autoincrement createtime updatetime checktime collation checksum createoptions comment;
do
if [ "$ datalength" -eq "0"] || [ "$ Engine" = "MEMORY"] || [ "$ Engine" = "InnoDB"]; then continue; fi
fragmentation = $ (($ datafree * 100 / $ datalength))
if [ "$ fragmentation" -gt $ optimize_limit]; then
echo "$ database. $ name is $ fragmentation% fragmented."
mysql -u "$ username" -p "$ password" -NBe "OPTIMIZE TABLE $ name;" "$ Database"
fi
done
done
При запуску скрипта буде запитано ім'я користувача і пароль. Користувач повинен мати всі необхідні права. Як правило, це root. Мінлива optimize_limit - межа оптимізації в процентах. Так, і ще одне важливе поміченим. На час оптимізації таблиці - вона блокується на запис. Тому для дуже великих таблиць скрипт потрібно запускати під час, коггда немає активної роботи з таблицями, або все-таки виробляти їх оптимізацію вручну.