Оптимизация таблиц базы данных

03 Июн 2008
Опубликовано VladSavitsky
Задача: 

Уменьшить размер таблиц (cache, sessions, watchdog, accesslog и др.), в которых часто удаляются данные и образуются "пустоты".

Решение

Таблицы для хранения логов, такие как accesslog или watchdog при нормальном функционировании сайта регулярно очищаются от старых записей. Это происходит по расписанию, поэтому важно чтобы на сайте корректно исполнялся cron.php.

Совет для MySQL. Некоторые таблицы с часто обновляемым содержимым - cache, session - могут время от времени "распухать" в размере за счёт пустого места, остающегося в файлах после удаления записей. Хотя реальный размер данных может быть небольшим, таблица при этом может занимать много места. Имеет смысл время от времени (раз в сутки, например) проводить оптимизацию таблиц.

Варианты

  • Использовать модуль db_maintenance
  • Создать скрипт, который будет запускаться из сrontab

Использовать модуль db_maintenance

Модуль позволяет выбрать таблицы, которые будут оптимизироваться при запуске cron.php
Описание модуля: db_maintenance

Создать скрипт, который будет запускаться из сrontab

  • Создать скрипт, в котором по аналогии указать таблицы, которые нуждаются в оптимизации.
  • Поместить этот скрипт в корневой каталог сайта
  • Установить в сrontab, таким же способом как и cron.php

Вариант 1.
В нем к базе подключаемся используя функции друпала. Префиксы таблиц
обрабатываются средствами Drupal:

<?php
include_once "includes/common.inc";
db_query("OPTIMIZE TABLE {cache}");
db_query("OPTIMIZE TABLE {sessions}");
db_query("OPTIMIZE TABLE {watchdog}");
?>

Вариант 2.
Этот код самостоятельно подключается к базе и названия таблиц жестко прописаны в коде. Этот вариант будет работать быстрее, чем 1й.

  • Создать скрипт с кодом:
    <?php
     $link = mysql_connect("хост", "пользователь", "пароль")
     or die("Could not connect: " . mysql_error());
     
    mysql_select_db("... ваша БД....");
    $result = mysql_query("OPTIMIZE TABLE batch, book, cache, cache_update, cache_filter, cache_form, cache_menu, cache_page, comments, comment_notify, files, flood, history, node, node_comment_statistics, node_revisions, menu_links, search_dataset, search_total, search_index, search_node_links, sessions, term_data, term_hierarchy, term_node, upload, variable, watchdog");
    ?>
  • Сохранить в файл: http://example.com/optimize.php
  • Настроить вызов этого файла по крону (cron job)

Проблема этого метода такая же как и у файла cron.php - при многократном обращении извне возможно блокирование работы сайта. Поэтому имя этого файла должно быть неизвестно посторонним или запрещёно обращение к этому файлу извне совсем.

Вариант 3. Использование mysqladmin
В настройках крона (cron) прописать оптимизацию всех таблиц базы данных:

mysqlcheck -uUSER -pPASSWORD --auto-repair --check --optimize DATABASENAME

Использованные материалы

 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>