it-swarm-eu.dev

Je přidání indexů do databáze Drupal databáze bezpečné)?

Hledal jsem a četl jsem o tom, ale neviděl jsem nic definitivního ohledně tématu přidávání indexů do Drupal tabulek (jak jádro, tak přispívat)).

Mým hlavním zájmem je to, co se stane s jakýmikoli vlastními indexy, když aktualizujete základní nebo přispívající kód a dojde ke změnám schématu. Co se stane v tomto případě?

UPRAVIT:

Myslím, že některé souvislosti mohou pomoci. V první řadě se zabývám přidáváním indexů do tabulek pro vyladění výkonu webu (dotazy zobrazované v protokolu pomalých dotazů, stránky s pomalým zobrazením atd.). To může zahrnovat přidání indexu do tabulky v modulu někoho jiného. Například

  1. Nainstaluji modul foo
  2. Modul foo vytvoří tabulku foo
  3. Přidám index do tabulky foo
  4. Modul foo obsahuje aktualizaci, která mění schéma

Co se stalo?

12
mpdonadio

Ano, mohlo by to vést k problémům.

Pokud modul chce něco udělat se sloupcem, do kterého jste přidali index, odstraní jeho vlastní indexy a poté provede jakoukoli operaci, kterou má v úmyslu provést.

To, co přesně se stane, bude záviset na typu vaší databáze a na skutečně provedené operaci. Například přejmenování sloupce bude v MySQL fungovat dobře, ale na PostgreSQL selže. Pokud se však tento sloupec pokusí odstranit (možná po migraci dat do jiné tabulky/sloupce), selže.

Šance, že k tomu dojde, jsou relativně nízké, alespoň u drobných aktualizací (záleží však na skutečném modulu. Obvykle nepřidávám žádné změny což by mohlo něco zlomit na menší vydání), ale je to možné.

Navrhuji, abyste se pokusili spolupracovat se správci modulů. Pokud jsou problematické dotazy ze samotného modulu, pak správci pravděpodobně šťastně přidají indexy, pokud poskytnete opravu. Před a po přidání indexu poskytněte DESCRIBE výstup problematických dotazů. Poskytněte také opravu, která aktualizuje schéma (včetně funkce aktualizace, aby byla nastavena pro stávající instalace).

Někdo, kdo aktivně pracuje na věcech souvisejících s výkonem a dělá výše uvedené věci opravdu dobře, je úlovek, zde je příklad: http://drupal.org/node/98395

7
Berdir

Jak je uvedeno v DatabaseSchema_pgsql :: changeField a v db_change_field () :

DŮLEŽITÁ POZNÁMKA: Chcete-li zachovat přenositelnost databáze, musíte explicitně znovu vytvořit všechny indexy a primární klíče, které používají změněné pole.

To znamená, že před zavoláním db_change_field () musíte zrušit všechny postižené klíče a indexy pomocí db_drop_ {primární_key, unique_key, index} (). Chcete-li znovu vytvořit klíče a indexy, předejte definice klíčů jako volitelný argument $ new_keys přímo do db_change_field ().

Předpokládejme například, že:

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

a chcete změnit foo.bar tak, aby byl typ serial, a ponechal jej jako primární klíč. Správná posloupnost je:

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

Podobné kódy jsou hlášeny pro Drupal 7.

Mějte na paměti, že podle mého názoru nemůžete odebrat primární klíč, který používá sériové pole. On Drupal 6, dostal jsem chybu pokaždé, když jsem to zkusil; nezkoušel jsem to na Drupal 7).

Kromě toho nevím o žádném jiném problému, který byste mohli mít s databázovými indexy.

Pokud jde o přidání indexu do databázové tabulky vytvořené z jiného modulu, nenavrhoval bych to provést, protože:

  • Modul nevypustí index pro pole, které se mění, pokud modul tento index sám nevytvořil. Modul by to nemohl udělat, protože nezná název indexu.
  • Úpravy databázové tabulky vytvořené jiným modulem není nikdy dobrý nápad, a to ani v případě, že je modul jádrovým modulem. Pokud existuje jiný modul, který mění stejnou tabulku, jak by mohly moduly zvládnout jakýkoli konflikt, který mají mezi sebou, nebo se změnami, které by základní modul použil ve své vlastní databázi?

Pokud je databázová tabulka vytvářena z jiného modulu (základní modul nebo modul třetí strany), navrhl bych otevřít žádost o funkci modulu a poskytnout případ použití pro použití nového indexu; Pokud se vyskytne nějaký problém s výkonem, může být žádoucím způsobem přidání indexu.

Pokud se chystáte přidat index do tabulky vytvořené z jiného modulu na svůj vlastní web, pak buďte připraveni na jakékoli změny, které musíte udělat na svém vlastním modulu pokaždé, když je modul aktualizován, a před instalací na svůj vlastní web .
Jste to vy, kdo se může rozhodnout, zda práce navíc stojí za výkon, který získáte. Osobně si ale nemyslím, že to stojí za to.

2
kiamlaluno