Dec 12 2006

MySQL: verificando se um índice existe

Autor: Marcos Dell Antonio - Categorias: Cotidiano, Delphi

Observações: a versão do MySQL usada para os testes foi a 3.2.9. Provavelmente esta solução é compatível com as versões mais novas.

Índices (ou indexes) são perfeitos quando se trata de melhorar o desempenho de acesso ao banco. Hoje mesmo consegui reduzir o tempo de processamento de um SELECT de 16s para 5s. Tendo em vista que a tabela possui mais de 15.000 registros, consegui chegar a um tempo razoável.

Mas esse post não é sobre os benefícios dos índices, e sim sobre como verificar se um determinado índice já existe. Não há um comando específico para checar isso, portanto vamos a baixaria:

1 SHOW INDEX FROM tabela

O comando acima, de acordo com a documentação do MySQL, retorna os índices de uma tabela. Dentre as informações retornadas, existe uma que representa o nome do índice: Key_name. É através deste campo que podemos verificar se um índice existe. Para isso, criei a seguinte rotina (em Delphi):

1 function ExisteIndice(tabela, indice: string): boolean; 2 var 3 query: TSDQuery; 4 begin 5 try 6 query := TSDQuery.Create(nil); 7 query.DatabaseName := 8 dtmDataModule.dtbBancoDados.DatabaseName; 9 query.SQL.Add('SHOW INDEX FROM ' + tabela); 10 query.Open; 11 12 query.First; 13 while (not(query.Eof)) do 14 begin 15 if (query.FieldByName('key_name').AsString = indice) then 16 begin 17 Result := true; 18 Break; 19 end; 20 21 query.Next; 22 end; 23 finally 24 query.Close; 25 FreeAndNil(query); 26 end; 27 end;

O que ela faz? Simples:

  1. Retorna todos os índices de uma determinada tabela (parâmetro “tabela”);
  2. Verifica se entre os índices retornados existe algum igual ao passado no parâmetro “indice”;
  3. Se existir, retorna true. Caso contrário, retorna false.

Pronto! Problema resolvido. :-)

Se você cria dinamicamente as tabelas e índices do seu sistema, pode utilizar esta rotina para verificar se o índice já existe antes de criá-lo. Se existir, poderá ignorar a criação ou removê-lo para criá-lo novamente.

É isso aí. Até +.

Adicione ao del.icio.us del.icio.us | Adicione ao Rec6 Rec6

Faça um comentário