Якщо ваш плагін матиме багато даних, то використовувати wp_postmeta
НЕ хорошу ідею, як показано нижче:
Взявши за приклад WooCommerce, у магазині з ~ 30 000 продуктами в середньому буде, наприклад, ~ 40 метаданих (атрибутів та всього) на продукт, 5 зображень товару на продукт, а це означає, що буде ~ 4 мета зображення для кожного зображення:
30000 виробів х 40 мета кожен = 1 200 000 рядків wp_postmeta
+
30000 продуктів x 5 зображень кожен x 4 мета зображення для кожного = 600 000 рядків wp_postmeta
Тож із лише 30 000 продуктів ви шукаєте, що мають 1800000 рядків 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
стіл буде повільним, коли це робиться. На сервері, де я тестував рішення, яке я реалізував нижче, усі вони були встановлені та налаштовані належним чином та оптимізовані, і сайт працював приємно ОК для не ввійшли користувачів та звичайно виконаних запитів з моменту запуску кешування плагінів.
Але в той момент, коли користувач, який увійшов у систему, намагався зробити щось, що зазвичай не робиться, або крони, кешування плагінів чи будь-яка інша утиліта хотіла отримати фактичні дані з db, щоб кешувати їх чи робити щось інше, все пішло повільно.
Тому я спробував щось інше:
Я зашифрував невеликий плагін, щоб перенести всі мета продукту (postmeta для продукту типу повідомлення ) до спеціальної таблиці, згенерованої за кодом. Цей плагін взяв усі мета для кожної публікації та створив таблицю, додавши кожен мета у вигляді стовпців та вставляючи значення у кожен рядок. Я перетворив формат EAV в горизонтальний, плоский реляційний формат. У мене також був плагін, щоб видалити постмета з усіх переміщених продуктів із wp_postmeta
таблиці.
Поки я перебуваю на цьому, я перемістив вкладений файл postmeta та мета інших типів публікацій у свої власні таблиці.
Потім я зачепився у get_(post_type)_meta
фільтр, щоб замінити пошук метаданих, щоб подати їх з нових спеціальних таблиць.
Тепер той самий запит з попереднього часу, на який пішло ~ 3 секунди, wp_postmeta
займає ~ 0,006 секунди. Зараз сайт поводиться так, ніби це була свіжа установка WP.
....................
Природно, що робити речі Wordpress краще. Це фактично норма.
Однак також очевидно, що таблиця EAV дуже неефективна в масштабуванні. Вона нескінченно гнучка і дозволяє зберігати будь-які дані, але ціна, яку ви платите за це, - це продуктивність. Це фундаментальна компроміс.
У цьому контексті важко сказати тому, хто має намір мати купу даних і - не дай бог - запитувати / шукати ці дані, щоб wp_postmeta
точно використовувати таблицю. Спектакль буде чудовим.
Використання власних таблиць дозволить вашим даним накопичуватися та залишатися досить швидкими.
Так само, як Піппін Вільямс, творець плагіна Easy Digital Downloads, згадав, що він буде використовувати власні таблиці, якщо він тільки починає кодувати свій плагін, якщо ви збираєтеся створити щось, що буде використовуватися протягом тривалого часу або накопичити багато даних, ефективніше використовувати власні таблиці, якщо ви їх добре розробили.
Ви повинні переконатися, що будь-який інший розробник плагінів / аддонів має засоби підключити ваш плагін, щоб маніпулювати вашими даними до і після отримання даних. Якщо ви це зробите, то ви досить тверді.