Дело в том, что в таблицах, которые используются для нужд движка, данные постоянно меняются. А таблицы, если их не оптимизировать, будут работать немножко медленнее. Если сайт у вас небольшой, то, наверное, вы и не заметите разницу. А если нагрузка большая? Я как-то столкнулся с тем, что у моих клиентов возникли проблемы с провайдером- сайт слишком нагружал 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'].'<br />
';
} // for di
}
if(!empty($tmp1)) $TPL_main.=$tmp1.'<a href="/'.$Core_module.'/optimize">Оптимизировать</a> (в это время таблицы блокируются, у посетителей могут быть проблемы)
';
У меня функция get_rows берет из БД данные и помещает в массив.
Тоесть SHOW TABLE STATUS возвращает информацию по всем таблицам БД.
В коде я не сделал проверку на таблицы MYISAM, но сейчас, как правило, на хостингах используются именно они.
Из ссылок я бы посоветовал почаще обращаться к документации - http://www.mysql.ru
Последние 10: