Нужно ли дефрагментировать базу данных MySQL?
  

Нужно ли дефрагментировать базу данных MySQL?15.09.2008 00:00

Дело в том, что в таблицах, которые используются для нужд движка, данные постоянно меняются. А таблицы, если их не оптимизировать, будут работать немножко медленнее. Если сайт у вас небольшой, то, наверное, вы и не заметите разницу. А если нагрузка большая? Я как-то столкнулся с тем, что у моих клиентов возникли проблемы с провайдером- сайт слишком нагружал 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

 

 

<<< Если клиенты присылают документы в формате MS Word
Если клиенты присылают документы в формате MS Word
Автоматическое изменение размеров изображений >>>
Автоматическое изменение размеров изображений