Czy dodawanie indeksów do bazy danych Drupal jest bezpieczne?

12

Szukałem i czytałem o tym, ale nie widziałem nic definitywnego na temat dodawania indeksów do tabel Drupal (zarówno core, jak i contrib).

Moje główne obawy dotyczą tego, co dzieje się z dowolnymi indeksami niestandardowymi, gdy aktualizujesz kod podstawowy lub contrib i są zmiany schematu. Co się stanie w tym przypadku?

EDYTOWAĆ:

Myślę, że jakiś kontekst może pomóc. Zależy mi przede wszystkim na dodawaniu indeksów do tabel w celu dostrojenia wydajności witryny (zapytania wyświetlane w dzienniku powolnych zapytań, strony z wolnymi widokami itp.). Może to obejmować dodanie indeksu do tabeli w czyimś module. Na przykład

  1. Instaluję moduł foo
  2. Moduł foo tworzy tabelę foo
  3. Dodaję indeks do tabeli foo
  4. Moduł fooma aktualizację, która zmienia schemat

Co się dzieje?

mpdonadio
źródło

Odpowiedzi:

7

Tak, może to powodować problemy.

Jeśli moduł chce zrobić coś z kolumną, do której dodano indeks, usunie własne indeksy, a następnie wykona dowolną operację, którą zamierza wykonać.

To, co dokładnie się stanie, będzie zależeć od typu bazy danych i faktycznie wykonanej operacji. Na przykład zmiana nazwy kolumny będzie działać poprawnie z MySQL, ale nie powiedzie się na PostgreSQL. Ale jeśli spróbuje usunąć tę kolumnę (może po migracji danych do innej tabeli / kolumny), zakończy się niepowodzeniem.

Szanse na to, że tak się stanie, są stosunkowo niewielkie, przynajmniej w przypadku drobnych aktualizacji (zależy to jednak od faktycznego modułu. Zwykle nie dodam żadnych zmian, które mogłyby coś zepsuć w mniejszych wydaniach), ale jest to możliwe.

Sugeruję, abyś spróbował współpracować z opiekunami modułów. Jeśli problematyczne zapytania pochodzą z samego modułu, opiekunowie prawdopodobnie chętnie dodają indeksy, jeśli dostarczysz łatkę. Zapewnij wyjście DESCRIBE problematycznych zapytań / zapytań przed i po dodaniu indeksu. Dostarcz także łatkę, która aktualizuje schemat (w tym funkcję aktualizacji, aby ustawić go dla istniejących instalacji).

Ktoś, kto aktywnie pracuje nad rzeczami związanymi z wydajnością i robi to naprawdę dobrze, jest złapany, oto przykład: http://drupal.org/node/983950

Berdir
źródło
2

Jak podano w DatabaseSchema_pgsql :: changeField oraz w db_change_field () :

WAŻNA UWAGA: Aby zachować przenośność bazy danych, musisz jawnie odtworzyć wszystkie indeksy i klucze podstawowe, które używają zmienionego pola.

Oznacza to, że przed wywołaniem db_change_field () musisz usunąć wszystkie klucze i indeksy, których dotyczy problem, za pomocą db_drop_ {primary_key, unique_key, index} (). Aby odtworzyć klucze i indeksy, przekaż definicje kluczy jako opcjonalny argument $ new_keys bezpośrednio do db_change_field ().

Załóżmy na przykład, że masz:

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

i chcesz zmienić foo.bar na typ serial, pozostawiając go jako klucz podstawowy. Prawidłowa sekwencja to:

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

Podobny kod jest zgłaszany dla Drupal 7.

Należy pamiętać, że z mojego doświadczenia nie można usunąć klucza podstawowego, który używa pola szeregowego. Na Drupal 6 zawsze pojawiał się błąd; Nie próbowałem tego na Drupal 7.

Poza tym nie znam żadnego innego problemu z indeksami baz danych.

Jeśli chodzi o dodawanie indeksu do tabeli bazy danych utworzonej z innego modułu, nie sugerowałbym tego, ponieważ:

  • Moduł nie upuszcza indeksu dla zmienianego pola, jeśli sam moduł nie utworzył tego indeksu. Moduł nie byłby w stanie tego zrobić, ponieważ nie zna nazwy indeksu.
  • Modyfikowanie tabeli bazy danych utworzonej przez inny moduł nigdy nie jest dobrym pomysłem, nawet jeśli moduł jest modułem podstawowym. Jeśli istnieje inny moduł, który zmienia tę samą tabelę, w jaki sposób moduły mogłyby poradzić sobie z jakimkolwiek konfliktem, jaki mają ze sobą, lub ze zmianami, które moduł podstawowy zastosowałby do własnej bazy danych?

Jeśli tabela bazy danych jest tworzona z innego modułu (modułu podstawowego lub modułu innej firmy), sugerowałbym otwarcie żądania funkcji dla modułu, podając przypadek użycia nowego indeksu; jeśli występuje jakikolwiek problem z wydajnością, pożądane jest dodanie indeksu.

Jeśli zamierzasz dodać indeks do tabeli utworzonej z innego modułu we własnej witrynie, przygotuj się na wszelkie zmiany, które musisz wprowadzić w module niestandardowym za każdym razem, gdy moduł jest aktualizowany, a przed zainstalowaniem go we własnej witrynie .
To Ty decydujesz, czy dodatkowa praca jest warta wydajności, którą otrzymasz. Osobiście nie sądzę, żeby było warto.

kiamlaluno
źródło
Dzięki. Jak by to działało, jeśli dodam indeks do tabeli, aby zwalczyć wolne zapytanie, a nie tylko zmianę własnego modułu? Spróbuję edytować moje pytanie, aby było trochę bardziej jasne, gdy będę miał szansę.
mpdonadio
3
Możesz również rozważyć użycie DB Tuner, który jest przydatny, aby wiedzieć, które indeksy utworzyć.
tostinni
@tostinni Tak, pytanie było prawie bezpośrednio związane z wdrażaniem zaleceń DB Tuner.
mpdonadio