Если ваш плагин будет иметь много данных, то использование wp_postmeta
НЕ является хорошей идеей, как показано ниже:
Если взять в качестве примера WooCommerce, в магазине с ~ 30 000 товаров будет в среднем, скажем, ~ 40 пост-мета (атрибуты и все) на продукт, 5 изображений товара на продукт, что означает ~ 4 мета изображения для каждого изображения:
30000 продуктов х 40 мета каждый = 120000 строк в wp_postmeta
+
30 000 товаров x 5 изображений каждый x 4 мета изображения для каждого = 600 000 строк в wp_postmeta
Таким образом, имея всего 30 000 продуктов, вы получаете 1,800 000 строк wp_postmeta
.
Если вы добавите больше свойств к своим продуктам или изображениям продуктов, это число умножится.
Проблема с этим двоякая:
- Самостоятельные объединения очень дороги с MySQL
wp_postmeta
таблица не индексируется, если вы не используете более поздние версии mysql (т. е. нет индекса FULLTEXT для meta_value
)
Чтобы привести пример из реального случая:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
При этом выбирается город доставки из всех деталей заказа, что длится ~ 3 секунды на выделенном сервере начального уровня, даже если есть 5-10 заказов . Это связано с тем, что запрос выполняется из wp_postmeta
таблицы с ~ 3 миллионами строк в оперативной установке.
Даже домашняя страница идет довольно медленно, потому что тема извлекает различные элементы wp_postmeta
- слайдеры, несколько вставок обзора, несколько других мета. В целом, список товаров очень медленный, поиск товаров аналогично медленен.
Вы не можете исправить это любым нормальным способом. Вы можете разместить Elastic Search на своем сервере и использовать плагин Elastic Search в Wordpress, вы можете использовать redis / memcached, вы можете использовать хороший плагин для кэширования страниц, но в итоге фундаментальная проблема останется - получение любого объема данных из раздутого wp_postmeta
стол будет медленным, когда это будет сделано. На сервере, где я тестировал решение, которое реализовал ниже, все они были установлены и настроены должным образом и оптимизированы, и сайт работал удовлетворительно нормально для пользователей, не вошедших в систему или часто выполняющих запросы, так как подключались плагины кэширования.
Но в тот момент, когда вошедший в систему пользователь попытался сделать что-то, что обычно не выполнялось, или cron, плагины для кэширования или любая другая утилита захотели получить фактические данные из базы данных для кеширования или сделать что-то еще, все пошло не так, как надо.
Поэтому я попробовал что-то еще:
Я написал небольшой плагин для переноса всей мета продукта (postmeta для продукта типа post ) в пользовательскую таблицу, созданную кодом. Этот плагин взял все мета для каждого поста и создал таблицу, добавив каждую мету в виде столбцов и вставив значения в каждую строку. Я превратил формат EAV в горизонтальный, плоский реляционный формат. У меня также был плагин для удаления постмета из всех перемещенных продуктов из wp_postmeta
таблицы.
Пока я занимался этим, я переместил вложение postmeta и мета всех других типов записей в свои собственные таблицы.
Затем я подключился к get_(post_type)_meta
фильтру, чтобы переопределить получение метаданных для обслуживания их из новых пользовательских таблиц.
Теперь тот же запрос, что и раньше, для получения которого потребовалось ~ 3 секунды, wp_postmeta
занимает ~ 0,006 секунды. Сайт теперь ведет себя так, как будто это была свежая установка WP.
....................
Естественно, делать вещи в Wordpress лучше. Это на самом деле норма.
Однако также очевидно, что таблица EAV очень неэффективна при масштабировании. Он бесконечно гибок и позволяет хранить любые данные, но цена, которую вы платите за это, - это производительность. Это фундаментальный компромисс.
В этом контексте трудно сказать кому-то, кто намеревается иметь кучу тонны данных и - не дай бог - запрос / поиск по этим данным, чтобы wp_postmeta
наверняка использовать таблицу. Хит производительности будет отличным.
Использование пользовательских таблиц позволит накапливать ваши данные и при этом оставаться достаточно быстрым.
Так же, как Пиппин Уильямс, создатель плагина Easy Digital Downloads, упомянул, что будет использовать пользовательские таблицы, если он только начинает кодировать свой плагин, если вы собираетесь создать что-то, что будет использоваться в течение длительного времени или накапливать много данных, более эффективно использовать пользовательские таблицы, если вы хорошо их спроектируете.
Вы должны убедиться, что любой другой разработчик плагинов / надстроек имеет возможность подключиться к вашему плагину для манипулирования вашими данными до и после извлечения данных. Если вы это сделаете, то вы довольно солидны.