Чи безпечно додавати індекси до бази даних Drupal?


12

Я шукав і читав про це, але не бачив нічого остаточного щодо теми додавання індексів до таблиць Drupal (як основних, так і вкладних).

Моє головне питання - це те, що відбувається з будь-якими спеціальними індексами, коли ви оновлюєте код core або contrib, і є зміни схеми. Що відбувається в цьому випадку?

Редагувати:

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

  1. Встановлю модуль foo
  2. Модуль foo створює таблицю foo
  3. Я додаю в таблицю індекс foo
  4. Модуль fooмає оновлення, яке змінює схему

Що сталося?

Відповіді:


7

Так, це може призвести до проблем.

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

Що саме відбудеться, буде залежати від типу вашої бази даних та фактично виконаної операції. Наприклад, перейменування стовпця буде добре працювати з MySQL, але не вдасться на PostgreSQL. Але якщо вона спробує видалити цей стовпець (можливо, після переміщення даних до іншої таблиці / спілки), він не вдасться.

Шанси, що це станеться, відносно низькі, принаймні для незначних оновлень (але це залежить від фактичного модуля, однак я зазвичай не додаю жодних змін, які можуть щось порушити до незначних релізів), але це можливо.

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

Хтось, хто активно працює над речами, пов’язаними з робочими характеристиками та робить все вищезазначене, справді добре, це є прикладом: http://drupal.org/node/983950


2

Як повідомляється в DatabaseSchema_pgsql :: changeField та в db_change_field () :

ВАЖЛИВА ПРИМІТКА. Щоб зберегти портативність бази даних, вам потрібно чітко відтворити всі індекси та первинні ключі, які використовують змінене поле.

Це означає, що перед тим, як викликати db_change_field (), ви повинні скинути всі постраждалі ключі та індекси за допомогою db_drop_ {basic_key, unique_key, index} (). Щоб відтворити ключі та індекси, передайте ключові визначення як необов'язковий аргумент $ new_keys безпосередньо в db_change_field ().

Наприклад, припустимо, що у вас є:

$schema['foo'] = array(
  'fields' => array(
    'bar' => array('type' => 'int', 'not null' => TRUE)
  ),
  'primary key' => array('bar')
);

і ви хочете змінити foo.bar на тип послідовного, залишаючи його в якості основного ключа. Правильна послідовність:

db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
  array('type' => 'serial', 'not null' => TRUE),
  array('primary key' => array('bar'))
);

Аналогічний код повідомляється і для Drupal 7.

Майте на увазі, що, на мій досвід, ви не можете видалити первинний ключ, який використовує послідовне поле. На Drupal 6 я отримував помилку, коли я намагався це робити; Я не пробував цього на Drupal 7.

Крім того, я не знаю жодної іншої проблеми з індексами баз даних.

Щодо додавання індексу до таблиці бази даних, створеної з іншого модуля, я б не пропонував це робити, оскільки:

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

Якщо таблиця бази даних створюється з іншого модуля (основного модуля або стороннього модуля), я б запропонував відкрити запит на функцію для модуля, надавши випадок використання для використання нового індексу; якщо є якісь проблеми ефективності, додавання індексу може бути бажаною справою.

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


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

3
Також ви можете розглянути можливість використання DB Tuner, який зручно знати, які індекси створити.
tostinni

@tostinni Так, це питання мало не пряме відношення до виконання рекомендацій DB Tuner.
mpdonadio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.