Який хороший баланс між повторним використанням полів та створенням нових у контексті масштабованості полів?


34

Я прочитав таку фразу на веб-сайті:

Замість додавання нових полів до типу вмісту, додавання вже існуючих полів є кращим варіантом для зменшення складності системи та покращення масштабованості.

І виникають певні сумніви.

У системі, яку ми розробляємо, ми маємо можливість повторно використовувати поле через 3 або 4 типи вмісту, але замість того, щоб покращити масштабованість, як сказано у цитованій фразі, боюся, це зменшить її, оскільки таблиця поля швидше перетвориться на вузьке місце (принаймні, це моє міркування в цьому випадку, оскільки всі значення цього поля разом становитимуть пару мільйонів на рік, і це зробить таблицю занадто великою). Ви згодні?

Скільки рядків було б розумним максимумом, на який слід орієнтуватися при архітектурі? Таким чином, ми могли вирішити, коли використовувати повторно поля та коли створити нові (навіть якщо шанс повторного використання є).


6
Я хотів би бачити відповіді, підкріплені фактичними показниками.
mpdonadio

Подумайте, ми зібрали дуже конструктивні та інформативні коментарі щодо цього питання. Однак я зачекаю один-два дні, перш ніж відзначити як відповідь, оскільки щось всередині мене наполягає на тому, що утримання одного або двох найважчих полів окремо (незважаючи на те, що їх можна повторно використати) може бути гарною ідеєю :) ... спеціально знаючи файли могли легко зростати на 5, 10 або 20 мільйонів предметів на рік.
rafamd

Відповіді:


24

Кількість даних у полі зазвичай не є проблемою. Якщо ви переживаєте з цього приводу, загляньте в альтернативні плагіни для зберігання польових даних або напишіть власні. Наприклад, MongoDB , який може мати справу майже з усім, що ви вкладаєте в нього. Наприклад, використовується на http://examiner.com .

Однак справжньою проблемою є кількість ваших полів. Оскільки зараз в Drupal 7, повна конфігурація поля всіх полів, незалежно від того, завантажені вони чи ні, виймається з кешу для кожного запиту.

Я бачив сайти з 250+ полями, де завантаження та несеріалізація конфігурації поля займає 13 МБ + пам'ять.

Редагувати: кеш інформації інформації про поле було покращено (детальніше див. Http://drupal.org/node/1040790 ) з Drupal 7.22, із кеша завантажуються лише поля пакетів, які відображаються на певній сторінці, і вони окремі записи кеша. Це працює лише в тому випадку, якщо немає неправильних викликів API, які вимагають екземплярів у кількох пакетах.


Привіт Бердіре, дякую за вашу відповідь. Я не знав про цю накладну кількість полів. Отже, ми повинні намагатися максимально повторно використовувати їх, але все ж, чи не слід намагатися розділити ті, на які ми знаємо, що є найважчими? Я мало знаю про монго і подібне, але чи справді їх не хвилює розмір групи, яку вони мають запитувати? Спасибі !
rafamd

Я насправді не знаю. Залежить, я думаю. Робити тест, як запропонував MPD, може бути не поганою ідеєю. Ви навіть можете порівняти це дуже низький рівень прямо в Mysql. Створіть дві таблиці з таким же компонуванням та індексами, як таблиці даних із полями, запишіть рядки 10 м (переконайтесь, що фактично використовуються різні значення для сутності_id) рядки в одне і 5 м у друге. Потім порівняйте продуктивність запису та ефективність читання (виходячи із сутності_id aka index). Я підозрюю, що ефективність читання буде майже рівною завдяки індексу, але ефективність запису може змінити значення.
Бердір

Однак, принаймні декілька полів не дійсно зміняться, тому якщо ви відчуваєте себе комфортніше, це не повинно бути проблемою.
Бердір

Писання є складною частиною, тому моя рекомендація щодо тесту. Що може бути протиінтуїтивним, це той факт, що MySQL видаляє кешовані записи на основі таблиці, а не рядка (востаннє я перевіряв). Я не впевнений, який би більше вплинув, накладні витрати на пам'ять декількох полів і таблиць або кеш-пропуски з запису в ту саму таблицю. Це, безумовно, залежить від руху / використання. Системи з декількома кешами (кеш Drupal, код кодування APC, користувач APC, кеш запитів MySQL, memcached, лак тощо) ускладнює рішення на основі кишок без профілювання.
mpdonadio

це більше не так: drupal.org/node/1040790
jackbravo

13

Я повністю погоджуюся з бердіром. Ось мій досвід проекту з мільйонами рядків і 30-40 полів на деяких типах вузлів.

  1. Кількість рядків у таблиці поля не є великою проблемою для продуктивності читання, оскільки всі поля вибираються первинним ключем.
  2. Кількість полів на тип вузла може швидко перерости у великі проблеми продуктивності при написанні нових вузлів. Маючи 30+ полів для одного типу вузла, під час створення нового вузла виводяться до 60+ операторів INSERT . На це потрібно кілька секунд. Якщо ви користуєтеся великою кількістю даних, це вплине на вашу ефективність. Масові вставки 1000 вузлів займуть майже годину. Якщо вам доведеться оновити 100000 вузлів, це велика проблема.
  3. Якщо ви думаєте, що проблема з кількістю полів торкнеться вас, вам слід серйозно задуматися над написанням власного польового сховища або просто не використовувати поля. (Ви все ще можете змусити ваш вузол працювати з видами з додатковими зусиллями.)
  4. Слово про MongoDB. Це дуже цікавий проект, і я сподіваюся, що він перетвориться на олімпійські програми великих БД. На жаль, порівняно зі зрілістю MySql або PgSql це дитина. Будьте готові мати справу з дуже молодим продуктом.

Привіт @BetaRide, дякую за розуміння. Близько 2) ми вже намагаємося мінімізувати кількість полів на тип вмісту, і це не зовсім те, що ми тут обговорюємо. Справжня угода полягає в тому: чи слід я сліпо повторно використовувати поля, коли це можливо, або намагаюся (принаймні) тримати найважчі один-два окремі (навіть якщо вони легко можуть бути однаковими, наприклад: вони насправді мають те саме ім’я тощо). Так, монго має бути на сьогодні останньою нашою альтернативою :)
rafamd

5

Якщо ви дійсно переживаєте, що буде, то я думаю, що моделювання в порядку.

Отримайте обліковий запис у Rackspace Cloud, Amazon, Linode або будь-якому іншому, де ви зможете легко запустити VPS. Зробіть два однакові екземпляри. Встановіть Drupal на кожному. Створіть кілька типів фіктивного вмісту та налаштуйте поля в одному напрямку, а в іншому - в іншій. Використовуйте модуль devel, щоб створити завантажений вміст. Відрегулюйте параметри продуктивності, щоб переконатися, що Drupal кешує, якщо потрібно. Запустіть mysqltuner і відрегулюйте MySQL для кожної рекомендації. Двічі перевірте параметри PHP та APC, щоб ви не отримували своп і не керували кешем APC.

Як тільки ви отримаєте гарну базову конфігурацію для кожного, починайте моделювати трафік (як звичайні відвідувачі, так і оновлення адміністратора) за допомогою wget і drush, а потім профіль.

Симуляції ніколи не є ідеальними, але вони можуть привести вас у правильному напрямку.


2

Одне питання зі масштабованістю в полях при використанні індексів для кожного поля таблиці в кожному полі створеної таблиці. Індекс кластеризованого первинного ключа є складовою більшості полів, тоді він створював окремі індекси для кожного поля окремо. Індекси створюють тонну накладних записів для бази даних, і в більшості випадків ніколи не використовуються.


2

ще одна порада: наявність великої кількості полів також спричинить проблеми з багатьма різними модулями. Наприклад, графічний інтерфейс Token зробить ваш браузер на кілька хвилин, якщо ви спробуєте, наприклад, відредагувати псевдоніми URL-адреси. Таку поведінку можна побачити на всіх сторінках, де маркер буде завантажений і відображений (включаючи devel - dpm () тощо)

Немає переваги від продуктивності в розділенні цих даних на кілька таблиць при використанні InnoDB (MyISAM відрізняється через блокування таблиці). Отже - якщо ви знаєте, у вас буде багато подібних типів вмісту з подібними полями (конфігурації яких також будуть однаковими, можливо, відрізнятимуться лише міткою) повторно використовуйте свої поля!

Це також може полегшити створення шаблону через подібні атрибути вузла.


1

Тільки поділяючись моєю історією, ми використовуємо Drupal Commerce і маємо приблизно 40 полів у нашому варіанті продукту (Sku), а потім ще 460 (так, божевільно) на нашому Дисплеї товарів. У нас було кілька поглядів на порівняння продуктів, які розглянули б усі ці сфери. Без кешування деякі завантаження сторінок можуть зайняти до хвилини!

Однак це спрацювало. Якщо ви використовували кешування та Varnish, час очікування користувача не був таким поганим.

Основна проблема, з якою ми зіткнулися з такою кількістю полів, полягає в програмі Display Suite, тому що це стане дуже повільним (колись невідповідним), якщо ми спробуємо перевпорядкувати або перемістити поле.

На щастя, ми вирішили трохи переорієнтувати нашу продукцію, щоб ми могли сподіватися максимальну кількість полів знизити до діапазону 200-250 для наших найскладніших продуктів (ми в науковому приладі, тому потрібні складні вимірювання та характеристики) .


0

Це цікаве питання. Я думав про це раніше, іноді повторне використання поля може бути зручним, щоб не було навантажень подібних полів "навколо", але, здається, нерозумно мати певний тип контенту, вибираючи з великого навантаження даних, які ми знати, що не означає повернутись у результаті.

Мені потрібно трохи більше інформації про проект, щоб порадити кращі практики масштабування. Який очікуваний трафік, скільки таких користувачів, які повинні увійти тощо? Наприклад, якщо весь трафік, за винятком користувачів вашого адміністратора, не підтверджений автентичністю та керований анонімно


Привіт @drupaljoe, дякую за вашу відповідь. Очікуваний трафік важко оцінити, оскільки це абсолютно новий сайт. Він розробляється з великою ретельністю, і ми очікуємо певного успіху, тому, скажімо, нам вдалося мати кілька сотень одночасних користувачів (більшість з них підтверджено автентифікацію). Саме так я і думав, запитуючи, що величезна таблиця повинна бути болючою, тому, можливо, ми повинні архітектором повторно використовувати ті поля, які не надто зростатимуть, і тримати окремо ті, про які збирається більше даних. Що можна вважати занадто великим? 1 мільйон ? 100 мільйонів ? 300 мільйонів? ...
rafamd

Я думаю, що коментарі інших двох про те, як це не повинно мати великого значення, тому що вибірки є на первинному ключі, - це хороші моменти. Напевно, я б сказав, що зараз просто підеш з цим, але переконайся, що ти прочитав про свої варіанти на майбутнє, монго для полів тощо. Ви не завжди можете вдруге здогадуватися про все, що стосується майбутнього вашого сайту
joevallender

0

Я до цих пір завжди використовував поля, але зараз розглядаю можливість використання унікальних полів на тип вузла для нового проекту. Насправді я хочу, щоб усе було добре розділене (поля, представлення даних, правила, контексти тощо) для кожного сукупності об'єктів. Тож воно підняло питання про масштабованість, що привело мене сюди. Мене втішає редакція Бердира (кеш інформації про поле було покращено (детальніше див. Http://drupal.org/node/1040790 ) з Drupal 7.22, тільки поля пакетів, які відображаються на певній сторінці, завантажуються з кеш і їх окремі записи кешу. Це працює лише в тому випадку, якщо немає неправильних викликів API, які вимагають екземплярів у кількох пакетах).

Я просто хочу зазначити, що є дуже цікавий модуль, який я місяцями використовую на кількох складних сайтах: https://www.drupal.org/project/render_cache . Це одна з тих прихованих дорогоцінних каменів, на мою думку.

Як йдеться на сторінці проекту, частина коментарів фактично використовується в самій DO.

Отже, маючи на увазі, чи поверне це консенсус на користь окремих сфер? Але застереження, про яке йдеться про DS, все ще є обривом. Це дуже дратує те, як економити через ajax, а не, наприклад, як інтерфейс управління основним блоком обробляє переупорядкування. Я думаю, що це проблема DS, хоча ...


-3

Згідно з моєю пропозицією Використання одних і тих же полів в окремому типі вмісту є хорошою ідеєю. Тому що це покращить роботу вашого сайту. У Drupal 7, коли ви використовуєте операцію вибору в цей час, використання одних і тих же полів у типі вмісту дійсно корисно для вашого сайту Drupal7.


1
У Drupal 7 вони почали використовувати доктрину ORM ... ні, ні. Drupal 8 навіть не використовує доктрину
Clive

"Вчення завжди повертає об'єкт з усіх відображених даних", також є хибним твердженням. Об'єкти можна коментувати, щоб вказати доктрині, що поведінка за замовчуванням не підходить. Це не дуже актуально, враховуючи, що, як каже Клайв, Drupal не використовує доктрину.
Летаріон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.