L'ajout d'index à une base de données Drupal est-il sûr?

12

J'ai cherché et lu à ce sujet, mais je n'ai rien vu de définitif sur le sujet de l'ajout d'index aux tables Drupal (à la fois core et contrib).

Ma principale préoccupation est ce qui se passe avec les index personnalisés lorsque vous mettez à jour le code principal ou contrib et qu'il y a des changements de schéma. Que se passe-t-il dans ce cas?

ÉDITER:

Je pense qu'un certain contexte peut aider. Je suis principalement concerné par l'ajout d'index aux tables pour optimiser les performances du site (requêtes apparaissant dans le journal des requêtes lentes, pages avec des vues lentes, etc.). Cela peut impliquer l'ajout d'un index à une table dans le module de quelqu'un d'autre. Par exemple

  1. J'installe le module foo
  2. Le module foo crée une table foo
  3. J'ajoute un index à la table foo
  4. Le module fooa une mise à jour qui modifie le schéma

Ce qui se produit?

mpdonadio
la source

Réponses:

7

Oui, cela pourrait entraîner des problèmes.

Si un module veut faire quelque chose avec la colonne sur laquelle vous avez ajouté un index, il supprimera ses propres index et fera ensuite l'opération qu'il a l'intention de faire.

Ce qui se passera exactement dépendra de votre type de base de données et de l'opération réellement exécutée. Par exemple, un changement de nom de la colonne fonctionnera correctement avec MySQL, mais échouera sur PostgreSQL. Mais s'il essaie de supprimer cette colonne (peut-être après la migration des données vers une autre table / colun), il échouera.

Les chances que cela se produise sont relativement faibles, au moins pour les mises à jour mineures (cela dépend cependant du module réel. Je n'ajoute généralement aucun changement qui pourrait casser quelque chose dans les versions mineures), mais c'est possible.

Ma suggestion serait d'essayer de travailler avec les responsables du module. Si les requêtes problématiques proviennent du module lui-même, les responsables ajouteront probablement volontiers les index si vous fournissez un correctif. Fournissez une sortie DESCRIBE de la ou des requêtes problématiques avant et après l'ajout de l'index. Fournissez également un correctif qui met à jour le schéma (incluez une fonction de mise à jour pour le définir pour les installations existantes).

Quelqu'un qui travaille activement sur des choses liées aux performances et qui fait vraiment bien ce qui précède est attrapé, voici un exemple: http://drupal.org/node/983950

Berdir
la source
2

Comme indiqué dans DatabaseSchema_pgsql :: changeField et dans db_change_field () :

REMARQUE IMPORTANTE: pour maintenir la portabilité de la base de données, vous devez recréer explicitement tous les index et clés primaires qui utilisent le champ modifié.

Cela signifie que vous devez supprimer toutes les clés et tous les index concernés avec db_drop_ {primary_key, unique_key, index} () avant d'appeler db_change_field (). Pour recréer les clés et les index, passez les définitions de clés comme argument $ new_keys facultatif directement à db_change_field ().

Par exemple, supposons que vous ayez:

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

et vous voulez changer foo.bar pour être de type série, en le laissant comme clé primaire. La séquence correcte est:

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

Un code similaire est rapporté pour Drupal 7.

Gardez à l'esprit que, d'après mon expérience, vous ne pouvez pas supprimer une clé primaire qui utilise un champ série. Sur Drupal 6, j'ai eu une erreur à chaque fois que j'essayais de faire ça; Je n'ai pas essayé ça sur Drupal 7.

En dehors de cela, je ne connais aucun autre problème que vous pourriez avoir avec les index de base de données.

À propos de l'ajout d'un index à une table de base de données créée à partir d'un autre module, je ne suggère pas de le faire, car:

  • Un module ne supprime pas d'index pour un champ en cours de modification, si le module lui-même n'a pas créé cet index. Il ne serait pas possible pour le module de faire cela car il ne connaît pas le nom de l'index.
  • La modification d'une table de base de données créée par un autre module n'est jamais une bonne idée, même dans le cas où le module est un module de base. S'il existe un autre module qui modifie la même table, comment les modules pourraient-ils gérer tout conflit qu'ils ont les uns avec les autres, ou avec les modifications que le module principal appliquerait à sa propre base de données?

Si la table de base de données est créée à partir d'un autre module (un module principal ou un module tiers), je suggère d'ouvrir une demande de fonctionnalité pour le module, fournissant un cas d'utilisation pour l'utilisation d'un nouvel index; en cas de problème de performances, l'ajout d'un index peut être la chose à faire.

Si vous comptez ajouter un index à une table créée à partir d'un autre module sur votre propre site, préparez-vous aux modifications que vous devez apporter à votre module personnalisé chaque fois que le module est mis à jour et avant de l'installer sur votre propre site .
C'est vous qui pouvez décider si le travail supplémentaire vaut la performance que vous obtenez. Personnellement, je ne pense pas que cela en vaille la peine.

kiamlaluno
la source
Merci. Comment cela fonctionnerait-il si j'ajoutais un index à une table pour lutter contre une requête lente, et pas seulement une modification de mon propre module? J'essaierai de modifier ma question pour qu'elle soit un peu plus claire lorsque j'en aurai l'occasion.
mpdonadio
3
Vous pouvez également envisager d'utiliser DB Tuner qui est pratique pour savoir quels index créer.
tostinni
@tostinni Oui, la question était presque directement liée à la mise en œuvre des recommandations de DB Tuner.
mpdonadio