A adição de índices a um banco de dados Drupal é segura?

12

Estive pesquisando e lendo sobre isso, mas não vi nada definitivo sobre o tópico de adição de índices às tabelas Drupal (core e contrib).

Minha principal preocupação é o que acontece com os índices personalizados quando você atualiza o código principal ou de contribuição e há alterações de esquema. O que acontece nesse caso?

EDITAR:

Eu acho que algum contexto pode ajudar. Estou preocupado principalmente em adicionar índices a tabelas para ajustar o desempenho do site (consultas que aparecem no log de consultas lentas, páginas com exibições lentas, etc.). Isso pode envolver a adição de um índice a uma tabela no módulo de outra pessoa. Por exemplo

  1. Eu instalo módulo foo
  2. Módulo foo cria tabela foo
  3. Eu adiciono um índice à tabela foo
  4. O módulo foopossui uma atualização que altera o esquema

O que acontece?

mpdonadio
fonte

Respostas:

7

Sim, isso pode resultar em problemas.

Se um módulo quiser fazer algo com a coluna na qual você adicionou um índice, ele removerá seus próprios índices e fará a operação que pretender fazer.

O que exatamente acontecerá dependerá do seu tipo de banco de dados e da operação realmente executada. Por exemplo, uma renomeação da coluna funcionará bem no MySQL, mas falhará no PostgreSQL. Mas se tentar excluir essa coluna (talvez após a migração de dados para uma tabela / coluna diferente), ela falhará.

As chances de que isso aconteça são relativamente baixas, pelo menos para pequenas atualizações (no entanto, depende do módulo atual. Geralmente, não adiciono nenhuma alteração que possa prejudicar as versões menores), mas é possível.

Minha sugestão seria que você tentasse trabalhar em conjunto com os mantenedores do módulo. Se as consultas problemáticas forem do próprio módulo, os mantenedores provavelmente adicionarão os índices com prazer, se você fornecer um patch. Forneça a descrição DESCRIBE da (s) consulta (s) problemática (s) antes e depois de adicionar o índice. Forneça também um patch que atualize o esquema (inclua uma função de atualização para configurá-lo para instalações existentes).

Alguém que está trabalhando ativamente em coisas relacionadas ao desempenho e faz muito bem o que foi mencionado acima é um exemplo: aqui está um exemplo: http://drupal.org/node/983950

Berdir
fonte
2

Conforme relatado em DatabaseSchema_pgsql :: changeField e em db_change_field () :

NOTA IMPORTANTE: Para manter a portabilidade do banco de dados, você deve recriar explicitamente todos os índices e chaves primárias que estão usando o campo alterado.

Isso significa que você deve eliminar todas as chaves e índices afetados com db_drop_ {primary_key, unique_key, index} () antes de chamar db_change_field (). Para recriar as chaves e índices, passe as definições de chave como o argumento opcional $ new_keys diretamente para db_change_field ().

Por exemplo, suponha que você tenha:

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

e você deseja alterar foo.bar para o tipo serial, deixando-o como a chave primária. A sequência correta é:

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

Código semelhante é relatado para o Drupal 7.

Lembre-se de que, pela minha experiência, você não pode remover uma chave primária que usa um campo serial. No Drupal 6, eu recebia um erro todas as vezes que tentei fazer isso; Eu não tentei isso no Drupal 7.

Além disso, não conheço nenhum outro problema que você possa ter com os índices de banco de dados.

Sobre como adicionar um índice a uma tabela de banco de dados criada a partir de outro módulo, eu não sugeriria isso, porque:

  • Um módulo não descarta um índice para um campo que está sendo alterado, se o próprio módulo não criou esse índice. Não seria possível para o módulo fazer isso porque não sabe o nome do índice.
  • Modificar uma tabela de banco de dados criada por outro módulo nunca é uma boa ideia, mesmo que o módulo seja um módulo principal. Se houver outro módulo que altere a mesma tabela, como os módulos podem lidar com qualquer conflito que tenham entre si ou com as alterações que o módulo principal aplicaria ao seu próprio banco de dados?

Se a tabela do banco de dados estiver sendo criada a partir de outro módulo (um módulo principal ou um módulo de terceiros), sugiro abrir uma solicitação de recurso para o módulo, fornecendo um caso de uso para o uso de um novo índice; se houver algum problema de desempenho, a adição de um índice pode ser a coisa desejada a ser feita.

Se você deseja adicionar um índice a uma tabela criada a partir de outro módulo em seu próprio site, esteja preparado para todas as alterações necessárias no seu módulo personalizado toda vez que o módulo for atualizado e antes de instalá-lo em seu próprio site. .
É você quem pode decidir se o trabalho extra vale o desempenho que você obtém. Pessoalmente, acho que não vale a pena.

kiamlaluno
fonte
Obrigado. Como isso funcionaria se eu adicionasse um índice a uma tabela para combater uma consulta lenta, não apenas uma alteração no meu próprio módulo? Vou tentar editar minha pergunta para ficar um pouco mais claro quando tiver uma chance.
mpdonadio
3
Além disso, você pode considerar o uso do DB Tuner, útil para saber quais índices criar.
tostinni
@tostinni Sim, a pergunta era quase direta relacionada à implementação de recomendações do DB Tuner.
mpdonadio