Чистим Базу WordPress

Этот пост есть смысл читать только вебмастерам :)

Задумал я тут базу данных WordPress почистить. А то что такое - в блоге ещё 2000 постов нет, а в базе уже за 7000 перевалило.

Диагноз налицо - ВОРДПРЕССЯНКА!!! То есть сохранение в базе тонн всякого говна, начиная от ревизий постов до аттачментов. Сначала разберёмся с первыми, потом догоним и всыпем вторым.

1. Чистка базы данных Вордпресса от ревизий

Пошёл я гуглить и нашёл массу советов, как чистить базу Вордпресса от ревизий. К примеру, раз и два. Почитал я эти советы и понял, что мужиков надули. Чистят-то они одну таблицу wp_posts, а надо как минимум три! - wp_posts, wp_term_relationships и wp_postmeta. Кто не верит, пусть медитирует на официальную диаграмму базы данных Wordpress. А ещё лучше - пусть зайдёт в phpMyAdmin и лично посмотрит на размер этих таблиц.

На блоге, который я сейчас лечу от “вордпрессянки” ситуация такая:

Реальных постов <= 2000 | записей в таблице постов wp_posts = 7655 | записей в таблице wp_term_relationships = 8571 | wp_postmeta - 18 129 записей

Это происходит потому, что в wp_term_relationships хранятся описания связей постов и рубрик. Соответственно, прежде чем удалять ненужные посты из wp_posts, надо грохнуть соответствующие им записи в wp_term_relationships

Команда выборки таких постов:

SELECT wp_term_relationships.* FROM wp_term_relationships, wp_posts WHERE wp_term_relationships.object_id = wp_posts.ID AND wp_posts.post_type = ‘revision’

Отмечаем их галочкой и сносим (через интерфейс phpMyAdmin, во вкладке SQL).

И только после этого, почистив wp_term_relationships, можно запускать аналогичную процедуру чистки для самих постов

DELETE FROM wp_posts WHERE post_type = ‘revision’

После этого в файл config.php надо вписать строчку
define(’WP_POST_REVISIONS’, false); чтобы блог не создавал новых ревизий.

Таким образом я смахнул 330 ненужных записей. Остались ещё тысячи. Львиную долю среди них занимают аттачменты.

2. Чистка базы данных Вордпресса от аттачментов

Все медиа-файлы - картинки и тд, подгруженные через Вордпресс, вписываются золотыми буквами в его базу данных, в форме “Заголовок”, “дата создания”, “ссылка на файла” и прочая не нужная мне информация.

В принципе, если есть любовь к менеджменту картинок через админку Вордпресса - всё это нужно. Мне - нет. Поэтому я это решил грохнуть. Тем более, что сами картинки на сервере остаются и ссылки на них в постах никуда не денутся. Грохнется только дополнительная информация о них, необходимая админке для управления аттачментами.

В общем, алгоритм примерно такой же

1. Чистим таблицу wp_term_relationships:

SELECT wp_term_relationships.* FROM wp_term_relationships, wp_posts WHERE wp_term_relationships.object_id = wp_posts.ID AND wp_posts.post_type = ‘attachment’

у меня там было 5307 таких записей, поэтому я сразу набрал быстрый вариант
DELETE wp_term_relationships.* FROM wp_term_relationships, wp_posts WHERE wp_term_relationships.object_id = wp_posts.ID AND wp_posts.post_type = ‘attachment’

2. Чистим сами посты
DELETE FROM wp_posts WHERE post_type=’attachment

Итог:
Реальных постов <= 2000 | записей в таблице постов wp_posts = 2,043 | записей в таблице wp_term_relationships = 2,959

Замечу, что если один пост привязывается к нескольким рубрикам, то записей в wp_term_relationships всегда будет больше, чем в wp_posts

Выполнил я эти две операции и понял, что ещё одна таблица осталась неоптимизированной. Потому что Wordpress, демон такой, не может без того, чтобы не распихать информацию о посте по куче самых разных таблиц.

3. Грохаем данный об аттачментах в wp_postmeta

Осталась у меня в базе ещё одна мега-таблица - wp_postmeta - на 18 129 записей и 4,8 Мб объёма. Ну, там вообще отдельная песня, разбираться можно годами, кто чего насрал в базу.
Я решил грохнуть только мета-данные по аттачментам, поскольку я уж все равно отказался от них (точнее от идеи управлять ими через админку WordPress). Забил такой запрос:

SELECT * FROM `wp_postmeta` WHERE `meta_key`=’_wp_attached_file’

Результат - 5300 записей. В этих мета-данных хранится абсолютный путь на сервере к файлу аттачмента. То есть вдумайтесь, видимо, программистам WP невдомёк, что этот путь простой операцией делается из обычного URLa картинки. Нет, надо отдельно насрать в базу данных.

Это ещё не всё. В мета-данных также хранятся данные с размерами каждого аттачмента в посте.
SELECT * FROM `wp_postmeta` WHERE `meta_key`=’_wp_attachment_metadata’

Результат - ещё 5200 записей. Там, в общем-то не только размеры, но тоже - информация, которая на раз-два вытягивается из обычного HTML поста, который лежит в wp_posts

На этом я решил остановиться. В общем полный рецепт чистки от аттачментов таков:

DELETE wp_term_relationships.* FROM wp_term_relationships, wp_posts WHERE wp_term_relationships.object_id = wp_posts.ID AND wp_posts.post_type = ‘attachment’
DELETE FROM wp_posts WHERE post_type=’attachment
DELETE FROM `wp_postmeta` WHERE `meta_key`=’_wp_attachment_metadata’ OR `meta_key`=’_wp_attached_file’

Итак, общий итог.

До чистки

Реальных постов <= 2000 | записей в таблице постов wp_posts = 7655, размер 18 Мб | записей в таблице wp_term_relationships = 8571, размер 360 кб | записей в таблице wp_postmeta = 18129, 4,8Мб

После чистки

Реальных постов <= 2000 | записей в таблице постов wp_posts = 2043, размер 9,6 Мб | записей в таблице wp_term_relationships = 2959, размер 172 кб | записей в таблице wp_postmeta = 7545, 623,1 кб

Итог: 12,5 мегабайт сбросили с воза.

Я никому не рекомендую повторять шаги 2 и 3. Это лично мой путь, т.к. я не только отказываюсь от менеджмента аттачментов через WP, но и вообще от многих его прелестей.

PPS: Пост получился довольно мрачным и черновым. Потом, быть может, напишу более лёгкую чистовую версию.

ЗЗЫ: Главная мораль в том, чторевизии это мелочь. А вот аттачменты, загруженные через WordPress - это БЕДА, если у вас 2000 постов, по 5 картинок на пост, больше 1000 уников в день и виртуальный хостинг.

! Бэкап перед прочтением статьи обязателен !


8 Responses to “Чистим Базу WordPress”

  1. Kichigai-san Says:

    Да, сурово. На аттачменты-то я давно смотрел, нахмурившись, но до потрошения пока руки не доходили. А делается всё это безобразие в базе, видимо, для удобства разработчиков плагинов.

  2. Icar Says:

    Видимо сильно припекло с торможением вордпресса. Но я так понял, у тех у кого постов всего ничего и трафика мало - бояться длительное время - нечего. :)

  3. eSTet Says:

    Да, Icar, бояться нечего, пока хотя бы тыщу постов не наберёшь. Когда на том блоге, что я лечу, было 50 постов - он держал удары с Digga по 30000 уников в день

    сейчас такой фокус не прокатывает, зависает с 503 ошибкой по нескольку раз в день.

  4. eSTet Says:

    Хотя…. ты попробуй по 10 картинок в пост заливать и посмотри, что получится и через какой срок? :)

  5. Александр Says:

    Для автора:
    У вас не правильно отображается символ ‘ в вашем случае это ’ (Для сравнения: ‘’ )
    Для кусков кода используйте wp-syntax.

    Для тех у кого не работает: замените в ручную выше обозначенные символы, правильный в английской раскладке на кнопке с буквой «э» без шифта.

  6. eSTet Says:

    Да, Александр всё правильно сказал

  7. AntonioFX Says:

    Спасибо, буду пробовать сейчас, а потом особенно, когда база разрастется

  8. Otshelnik-fm Says:

    Уже 2-й год, по разу в год, использую ваш метод.

    Сегодня оптимизация вышла отличной 64 мегабайта до, 31 мегабайт после.

    Связано это стем что я активно использую картинки, а каждая картинка складывается в медиабиблиотеку. Которую я и убил :)

    В дополнение есть еще метод

    DELETE FROM `wp_postmeta`
    WHERE `meta_key` IN(’_edit_lock’, ‘_edit_last’,'_wp_old_slug’) найдено в сети - http://www.webliberty.ru/navedenie-poryadka-v-baze-dannyih-mysql/

    У меня этот метод еще 7000 строк нашел

Leave a Reply




#hello#