- Статус
- Решено
- Решено в
- 2.3.8
Обзор проблемы
Начиная с версии 2.3.0 плагина WPML Media Translation, можно переводить и синхронизировать медиафайлы между переводами.
В рамках процесса настройки (который также запускается, когда Вы переходите с более ранней версии) WPML Media сканирует весь сайт на наличие URL-адресов медиафайлов, используемых в контенте.
Пометка записей, содержащих медиафайлы, помогает в дальнейшем, поэтому при определенных событиях, связанных с переводом медиафайлов (например, при переводе конкретной записи с медиафайлами), будут сканироваться только те записи, которые действительно содержат медиафайлы, чтобы обновить контент переведенными медиафайлами.
Однако на очень крупных сайтах процесс настройки может создавать нагрузку на базу данных, делая весь процесс медленнее, чем ожидалось.
По большей части нагрузка вызвана запросами, необходимыми для определения ID вложений на основе URL-адресов. Обычно ID вложения можно определить по атрибутам HTML-тега (например, id=”attachment_8” — здесь 8 является ID вложения). Если такой атрибут не используется, WPML Media определяет ID по самому URL-адресу. В этом случае используются два типа запросов:
- Запрос, который ищет совпадения по полю ‘guid’ в таблице wp_posts
- Еще один запрос, который ищет совпадения по полям meta_value в таблице wp_postmeta.
Однако ни одно из этих полей таблиц по умолчанию не индексируется. Поскольку происходит сопоставление текста (даже если это не частичный текстовый поиск), для больших баз данных оно может выполняться медленно.
Обходное решение
Один из способов обойти эту проблему — (хотя бы временно) добавить индексы для этих полей.
Вы можете сделать это с помощью двух SQL-запросов, подобных следующим:
ALTER TABLE `wp_posts` ADD INDEX `guid` (`guid`);
ALTER TABLE `wp_postmeta` ADD INDEX `meta_value` (`meta_value`(512));
Эти добавления не должны вызвать никаких побочных эффектов в Вашей базе данных, кроме незначительного увеличения её физического размера на диске. Если Вы предпочитаете отменить их после выполнения настройки WPML Media, Вы можете сделать это с помощью следующих двух MySQL-запросов:
ALTER TABLE `wp_posts` DROP INDEX `guid`;
ALTER TABLE `wp_postmeta` DROP INDEX `meta_value`;
Примечание: префикс wp_ для таблиц, упомянутых в запросах, может отличаться в зависимости от Вашей конфигурации WordPress. Обычно и по умолчанию используется wp_
Пример кейса: на сайте с примерно 140 000 вложений и около 5 000 записей настройка может занять более 30 минут. После добавления индексов настройка выполняется за пару минут. Тесты проводились в обычной среде разработки. На реальном рабочем сервере эти показатели могут быть ещё лучше.