L'aggiunta di indici a un database Drupal è sicura?


12

Ho cercato e letto questo, ma non ho visto nulla di definitivo sull'argomento dell'aggiunta di indici alle tabelle Drupal (sia core che contrib).

La mia preoccupazione principale è cosa succede con qualsiasi indice personalizzato quando aggiorni il codice core o contrib e ci sono cambiamenti nello schema. Cosa succede in questo caso?

MODIFICARE:

Penso che un certo contesto possa aiutare. Mi occupo principalmente dell'aggiunta di indici alle tabelle per ottimizzare le prestazioni del sito (query visualizzate nel registro delle query lente, pagine con visualizzazioni lente, ecc.). Ciò può comportare l'aggiunta di un indice a una tabella nel modulo di qualcun altro. Per esempio

  1. Installo il modulo foo
  2. Il modulo foo crea una tabella foo
  3. Aggiungo un indice alla tabella foo
  4. Il modulo fooha un aggiornamento che modifica lo schema

Che succede?

Risposte:


7

Sì, potrebbe causare problemi.

Se un modulo vuole fare qualcosa con la colonna in cui è stato aggiunto un indice, rimuoverà i propri indici e quindi farà qualunque operazione intenda fare.

Cosa accadrà esattamente dipenderà dal tipo di database e dall'operazione effettivamente eseguita. Ad esempio, una ridenominazione della colonna funzionerà bene con MySQL, ma non funzionerà su PostgreSQL. Ma se tenta di eliminare quella colonna (forse dopo aver migrato i dati in una tabella / colonna diversa), fallirà.

Le probabilità che questo accada sono relativamente bassi, almeno per aggiornamenti minori (non dipendono dal modulo vero e proprio però. Io di solito non aggiungo alcun cambiamenti che potrebbero rompere qualcosa da minori uscite), ma è possibile.

Il mio suggerimento sarebbe di provare a collaborare con i manutentori del modulo. Se le query problematiche provengono dal modulo stesso, i manutentori probabilmente aggiungeranno felicemente gli indici, se si fornisce una patch. Fornire l'output DESCRIBE delle query problematiche prima e dopo l'aggiunta dell'indice. Fornire anche una patch che aggiorni lo schema (includere una funzione di aggiornamento per impostarlo per le installazioni esistenti).

Qualcuno che sta attivamente lavorando su cose relative alle prestazioni e fa davvero bene quanto sopra è catturato, ecco un esempio: http://drupal.org/node/983950


2

Come riportato in DatabaseSchema_pgsql :: changeField e in db_change_field () :

NOTA IMPORTANTE: per mantenere la portabilità del database, è necessario ricreare esplicitamente tutti gli indici e le chiavi primarie che utilizzano il campo modificato.

Ciò significa che prima di chiamare db_change_field () è necessario eliminare tutte le chiavi e gli indici interessati con db_drop_ {primary_key, unique_key, index} (). Per ricreare le chiavi e gli indici, passare le definizioni delle chiavi come argomento facoltativo $ new_keys direttamente a db_change_field ().

Ad esempio, supponiamo di avere:

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

e vuoi cambiare foo.bar in modo che sia di tipo seriale, lasciandolo come chiave primaria. La sequenza corretta è:

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

Codice simile è riportato per Drupal 7.

Tieni presente che, per la mia esperienza, non puoi rimuovere una chiave primaria che utilizza un campo seriale. Su Drupal 6, ho avuto un errore tutte le volte che ho provato a farlo; Non l'ho provato su Drupal 7.

A parte questo, non conosco nessun altro problema che potresti avere con gli indici del database.

Informazioni sull'aggiunta di un indice a una tabella di database creata da un altro modulo, non consiglierei di farlo, perché:

  • Un modulo non rilascia un indice per un campo che viene modificato, se il modulo stesso non ha creato quell'indice. Non sarebbe possibile per il modulo farlo perché non conosce il nome dell'indice.
  • Modificare una tabella di database creata da un altro modulo non è mai una buona idea, anche nel caso in cui il modulo sia un modulo principale. Se esiste un altro modulo che modifica la stessa tabella, in che modo i moduli potrebbero gestire eventuali conflitti tra loro o con le modifiche che il modulo principale applicherebbe al proprio database?

Se la tabella del database viene creata da un altro modulo (un modulo principale o un modulo di terze parti), suggerirei di aprire una richiesta di funzionalità per il modulo, fornendo un caso d'uso per l'utilizzo di un nuovo indice; se ci sono problemi di prestazioni, l'aggiunta di un indice potrebbe essere la cosa desiderata da fare.

Se hai intenzione di aggiungere un indice a una tabella creata da un altro modulo sul tuo sito, allora preparati a tutte le modifiche che devi apportare al tuo modulo personalizzato ogni volta che il modulo viene aggiornato e prima di installarlo nel tuo sito .
Sei tu che puoi decidere se il lavoro extra vale la prestazione che ottieni. Personalmente, non penso che valga la pena, però.


Grazie. Come funzionerebbe se aggiungessi un indice a una tabella per combattere una query lenta, non solo una modifica al mio modulo? Proverò a modificare la mia domanda per essere un po 'più chiaro quando ne avrò la possibilità.
mpdonadio

3
Inoltre puoi prendere in considerazione l'utilizzo di DB Tuner, utile per sapere quali indici creare.
tostinni,

@tostinni Sì, la domanda era quasi direttamente correlata all'implementazione dei consigli di DB Tuner.
mpdonadio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.