Справа в тому, що в таблицях, які використовуються для потреб движка, дані постійно змінюються. А таблиці, якщо їх не оптимізувати, працюватимуть трошки повільніше. Якщо сайт у вас невеликий, то, напевно, ви й не помітите різницю. А якщо навантаження велике? Я якось зіткнувся з тим, що у моїх клієнтів виникли проблеми з провайдером- сайт занадто навантажував MySQL. Виявилося, що для виведення однієї сторінки (це був інтернет- магазин OS Commerce), генерувалося більше 120 запитів. У деяких випадках навіть більше 200-т. А так як відвідувачів було багато (рахунок йшов на тисячі), то база даних не справлялася. Довелося оптимізувати код, хоча це було непросто.
Можна зробити висновок, що дефрагментировать таблиці потрібно (як і PHP-код, звичайно ж :)).
Тепер про те, які таблиці оптимізувати. За-перше, тип повинен бути MyISAM або BDB. По-друге, серед полів повинні бути типи VARCHAR, BLOB або TEXT. Наскільки я зрозумів, в інших випадках оптимізація не потрібна.
Команда оптимізації проста:
OPTIMIZE TABLE ім'я_таблиці
Це грубий варіант пройти по всім існуючим таблицями. MySQL дефрагментирует таблиці. Але потрібно звернути увагу, що під час оптимізації таблиця буде заблокована. Що це означає, я точно не знаю, треба ще розібратися. Так як процес займає частки секунди, то ймовірність, що користувачі щось помітять, мала.
Як дізнатися, чи потрібна оптимізація? Хто працював з myphpadmin, знають, що можна подивитися багато інформації про таблиці. Це не складно зробити самостійно. Є така команда SHOW TABLE STATUS. У вихідних даних пошукайте Data_free, це і буде шукане число. Якщо воно більше 0, то оптимізація потрібна. Це, так би мовити, варіант більш тонкий.
Приблизний код для з'ясування, чи потрібна оптимізація:
if ($ data_info = get_rows ( 'SHOW TABLE STATUS')) foreach ($ data_info as $ di) if ($ di [ 'Data_free']> 0) $ tmp1. = 'Оптимізувати таблицю'. $ di [ 'Name'] . '
';
> // for di
>
if (! empty ($ tmp1)) $ TPL_main. = $ tmp1. 'оптимізувати (В цей час таблиці блокуються, у відвідувачів можуть бути проблеми)
';
У мене функція get_rows бере з БД дані і поміщає в масив.
Тобто SHOW TABLE STATUS повертає інформацію по всіх таблиць БД.
У коді я не зробив перевірку на таблиці MYISAM, але зараз, як правило, на хостингах використовуються саме вони.