Как оптимизировать фильтрацию записей по полям метаданных ACF в WordPress для повышения скорости выполнения?

У меня есть тип записи с почти полумиллионом постов. Раньше фильтрация по метаполям с помощью meta_query была быстрой, когда постов было меньше 2000. Но сейчас, когда постов больше 400 000, время загрузки составляет около 5 минут. Я предполагаю, что проблема связана с фильтрацией по метаполям. У меня есть много полей, участвующих в фильтрации, и переводить 400 000 записей на таксономии будет проблематично. Есть ли способ ускорить фильтрацию постов с использованием meta_query в wp_query? Я отображаю по 5 записей на странице, почему выборка занимает так много времени?
  • 8 ноября 2023 г. 15:40
Ответы на вопрос 2
Есть несколько способов оптимизировать фильтрацию записей по метаполям ACF в WordPress:

1. Используйте индексы базы данных: При работе с большим количеством записей может быть полезно добавить индексы к таблице базы данных, которая хранит метаполя. Для этого вы можете воспользоваться плагинами, такими как Advanced Custom Fields Pro или Custom Field Suite, которые предоставляют эту функциональность.

2. Используйте кеширование: Если фильтры не изменились между запросами, вы можете кешировать результаты запросов во временных таблицах базы данных. Это позволит вам значительно ускорить повторные запросы.

3. Предварительно загружайте данные: Если вы знаете, какие метаполя будут использоваться в фильтрах, вы можете предварительно загрузить их данные для всех записей, используя функции `get_post_meta()` или `get_field()`. Это поможет избежать множества запросов к базе данных во время фильтрации.

4. Используйте пагинацию: Если вы отображаете только 5 записей на странице, вы можете использовать параметры пагинации в `WP_Query`, чтобы загружать только нужные записи. Например, вы можете использовать параметры `posts_per_page` и `paged` для определения количества записей на странице и текущей страницы.

5. Используйте кэширование результатов запросов: Если вы заметили, что большая часть времени фильтрации затрачивается на выполнение запросов к базе данных, вы можете использовать кэширование результатов запросов с помощью плагинов, таких как Redis или Memcached. Это поможет ускорить выполнение повторных запросов.

Убедитесь также, что ваш сервер имеет достаточные ресурсы для обработки такого большого количества записей. Возможно, вам понадобится обновить серверное оборудование или использовать услуги хостинга с более высокой производительностью.

И наконец, проверьте, нет ли других факторов, которые могут замедлять вашу систему, таких как медленные запросы к базе данных или сложные операции внутри вашего шаблона.
1 вариант - Используйте Elastic
2 вариант - Перенесите данные для фильтрации в нормализованные таблицы с правильными типами данных
В обоих случаях работы будет достаточно. Возможно, второй вариант будет немного проще.

Почему работает медленно? Проверьте, какие SQL-запросы генерирует WordPress. Всё довольно очевидно. К сожалению, при такой архитектуре хранения метаданных замедление - неизбежное явление.
Можно ли ускорить? Можно попробовать создать индекс в таблице wp_postmeta по полю meta_value. В некоторых ситуациях это может немного помочь.
Однако, чтобы резко улучшить производительность, придется изменить способ хранения метаданных.
Похожие вопросы