Оптимизация базы данных WordPress — необходимая задача для поддержания высокой производительности сайта, особенно когда количество записей, комментариев и метаданных растёт. Многие решают использовать плагины, но это может увеличить нагрузку и добавить лишние зависимости. В этой статье рассмотрим, как оптимизировать базу данных вручную, без использования плагинов, используя SQL-запросы и функции WordPress.
Почему важна оптимизация базы данных WordPress
Со временем база данных WordPress накапливает много «мусора»: ревизии записей, спам-комментарии, транзиенты, устаревшие метаданные и многое другое. Это замедляет запросы к базе, увеличивает размер резервных копий и нагрузку на сервер. Регулярная оптимизация помогает:
- Уменьшить размер базы данных
- Ускорить время отклика сайта
- Избавиться от ненужных данных, которые не влияют на функциональность
Рассмотрим, как выполнить ключевые операции оптимизации вручную.
Удаление ревизий записей и автосохранений
WordPress сохраняет каждую ревизию записи, что может занимать много места. Для удаления ревизий можно использовать следующий SQL-запрос:
DELETE FROM wp_posts WHERE post_type = 'revision';
Также полезно удалить старые автосохранения:
DELETE FROM wp_posts WHERE post_type = 'autosave';
Если у вас нестандартный префикс таблиц, замените wp_ на ваш.
Для автоматизации через PHP можно создать функцию wpkeys_optimize_remove_revisions():
function wpkeys_optimize_remove_revisions() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'autosave'");
}
Её можно запускать через хук админки или вручную.
Очистка спам и корзины комментариев
Спам-комментарии и удалённые комментарии (корзина) занимают место и замедляют выборки. Удалите их SQL-запросами:
DELETE FROM wp_comments WHERE comment_approved = 'spam';
DELETE FROM wp_comments WHERE comment_approved = 'trash';
В PHP для выполнения:
function wpkeys_optimize_clear_comments() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_approved = 'spam'");
$wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_approved = 'trash'");
}
Удаление устаревших транзиентов
Транзиенты — это временные данные, которые хранятся в базе. Иногда они не удаляются корректно. Чтобы очистить все просроченные транзиенты, используйте запрос:
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%';
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();
Или через PHP:
function wpkeys_optimize_delete_expired_transients() {
global $wpdb;
// Удаляем просроченные транзиенты
$time = time();
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < {$time}");
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%'");
}
Оптимизация таблиц базы данных через SQL
После удаления данных имеет смысл выполнить оптимизацию таблиц, чтобы освободить пространство и дефрагментировать их. Для этого достаточно SQL-команды:
OPTIMIZE TABLE wp_posts, wp_comments, wp_options, wp_postmeta, wp_commentmeta;
Или в PHP через цикл:
function wpkeys_optimize_tables() {
global $wpdb;
$tables = [
$wpdb->posts,
$wpdb->comments,
$wpdb->options,
$wpdb->postmeta,
$wpdb->commentmeta
];
foreach ($tables as $table) {
$wpdb->query("OPTIMIZE TABLE {$table}");
}
}
Удаление устаревших метаданных
Иногда плагины или темы оставляют в базе записи метаданных, которые больше не используются. Для примера, удалим метаданные постов, связанных с несуществующими записями:
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;
Аналогично можно очистить комментарии метаданных.
Особенности и меры предосторожности
Перед выполнением любых запросов обязательно сделайте резервную копию базы данных. Ошибочные операции могут привести к потере данных и нарушению работы сайта.
Выполняйте запросы через phpMyAdmin, Adminer или в консоли MySQL. Также можно добавить PHP-функции в файл темы или плагина и запускать их выборочно.
Автоматизация оптимизации базы данных без плагинов
Чтобы не выполнять оптимизацию вручную, можно добавить в файл functions.php темы код, который будет регулярно очищать базу. Пример планировщика:
function wpkeys_schedule_db_optimization() {
if (!wp_next_scheduled('wpkeys_daily_db_optimization')) {
wp_schedule_event(time(), 'daily', 'wpkeys_daily_db_optimization');
}
}
add_action('wp', 'wpkeys_schedule_db_optimization');
function wpkeys_daily_db_optimization_callback() {
wpkeys_optimize_remove_revisions();
wpkeys_optimize_clear_comments();
wpkeys_optimize_delete_expired_transients();
wpkeys_optimize_tables();
}
add_action('wpkeys_daily_db_optimization', 'wpkeys_daily_db_optimization_callback');
Так вы будете поддерживать базу в хорошем состоянии без сторонних плагинов.
Дополнительные рекомендации по повышению производительности базы данных
Помимо очистки, важно следить за правильной индексацией таблиц, использовать кеширование запросов и избегать чрезмерного количества ревизий путем ограничения их числа в wp-config.php:
define('WP_POST_REVISIONS', 5);
Также можно использовать специализированные плагины, например Clearfy Pro, которые дополнительно оптимизируют базу и отключают лишние функции.