Anthony Ormond Posted November 19, 2008 Report Share Posted November 19, 2008 Estou criando um Ãndice no mysql "CREATE INDEX NOME_INDEX ON NOME_TABELA (COL_TABELA);" O que devo fazer para saber se o indice já existe? Desde já, agradeço pelo ajuda. Editado por - aormond on 21/11/2008 10:47:50 Quote Link to comment Share on other sites More sharing options...
Anthony Ormond Posted November 19, 2008 Author Report Share Posted November 19, 2008 Estou criando um Ãndice no mysql "CREATE INDEX NOME_INDEX ON NOME_TABELA (COL_TABELA);" O que devo fazer para saber se o indice já existe? Desde já, agradeço pelo ajuda. Editado por - aormond on 21/11/2008 10:47:50 Quote Link to comment Share on other sites More sharing options...
foliene Posted November 19, 2008 Report Share Posted November 19, 2008 eu uso uma funcao que é o seguinte primeiro uso o comando show index from "sua tabela" o MySQL vai retornar um subset som varias colunas, a 3a é o nome do indice e depois vem as colunas ..etc..entao voce verifica o nome que procura..e se um dia vc mudar a coluna colocando outra junto.. é só comparar Ari Quote Link to comment Share on other sites More sharing options...
jc Posted November 19, 2008 Report Share Posted November 19, 2008 citação:Estou criando um Ãndice no mysql "CREATE INDEX NOME_INDEX ON NOME_TABELA (COL_TABELA);" O que devo fazer para saber se o indice já existe? Desde já, agradeço pelo ajuda. id=quote>id=quote>Anthony, Vc pode utilizar a seguinte instrução SQL: id=code>id=code>Apesar de que, o MySQL irá criticar caso o nome do Ãndice para a chave já existir! -- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 Editado por - jc on 19/11/2008 15:18:42 Quote Link to comment Share on other sites More sharing options...
Anthony Ormond Posted November 19, 2008 Author Report Share Posted November 19, 2008 Olá Júlio Muito Obrigado pela ajuda. O show index verifica a existencia do Ãndice e caso já exista ele cria novamente?? Eu gostaria de apagar o indice caso ele exista. Gostaria de um exemplo. citação: citação:Estou criando um Ãndice no mysql "CREATE INDEX NOME_INDEX ON NOME_TABELA (COL_TABELA);" O que devo fazer para saber se o indice já existe? Desde já, agradeço pelo ajuda. id=quote>id=quote>Anthony, Vc pode utilizar a seguinte instrução SQL: id=code>id=code>Apesar de que, o MySQL irá criticar caso o nome do Ãndice para a chave já existir! -- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 Editado por - jc on 19/11/2008 15:18:42 id=quote>id=quote> Editado por - aormond on 19/11/2008 15:45:55 Quote Link to comment Share on other sites More sharing options...
jc Posted November 19, 2008 Report Share Posted November 19, 2008 Anthony, Na verdade o SHOW INDEX vai te mostrar todos os Ãndices da tabela em questão, bem como a chave primária e outras informações. Com isso, através da função SQLArray(), vc fazer uma varredura para achar o Ãndice ou fazer dessa forma abaixo: id=code>id=code>-- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 Quote Link to comment Share on other sites More sharing options...
Luisão Posted November 19, 2008 Report Share Posted November 19, 2008 Bom, acredito (e acho que li em algum lugar) que o MySQL gerencie os Ãndices internamente para obter os melhores resultados. Por exemplo, nos sistemas que usam MySQL aqui, ao se fazer ORDER BY ou SELECTs usando a cláusula WHERE, sem estar com os campos indexados, tais querys demoravam séculos... O que eu fiz então foi, ao invés de criar Ãndices compostos, indexei cada coluna separadamente em um Ãndice. Exemplo: For j = 1 to Len(aCampos) cSQL:= "ALTER TABLE "+tabela+" ADD INDEX K"+AllTrim(aCampos[j,2])+" ("+AllTrim(aCampos[j,2])+")" XSQLExecute(cSQL) Next id=code>id=code>Já que o MySQL "escolhe" o melhor método de se obter os dados a partir de um comando qualquer que retorne dados, desse modo, melhorou em muito a eficiência de minhas pesquisas. Porém, se o volume de dados e nº de colunas forem grandes, a 1ª indexação pode demorar um pouco, mas depois de feita, se você rodar o mesmo comando de novo, o próprio banco trata isso e apenas atualiza os indices. Quote Link to comment Share on other sites More sharing options...
Anthony Ormond Posted November 19, 2008 Author Report Share Posted November 19, 2008 Quando efetuo ALERT(INDEX("SHOW INDEX FROM "+cTable+" WHERE Key_mame = "+aNameInd+"")) o retorno é sempre falso. citação:Anthony, Na verdade o SHOW INDEX vai te mostrar todos os Ãndices da tabela em questão, bem como a chave primária e outras informações. Com isso, através da função SQLArray(), vc fazer uma varredura para achar o Ãndice ou fazer dessa forma abaixo: id=code>id=code>-- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 id=quote>id=quote> Quote Link to comment Share on other sites More sharing options...
Luisão Posted November 19, 2008 Report Share Posted November 19, 2008 Para excluir um Ãndice: ALTER TABLE nome_tabela DROP INDEX nome_indice id=code>id=code>Caso o Ãndice não exista, a mensagem será retornada: Can't DROP 'nome_indice' ; check that column/key exists Quote Link to comment Share on other sites More sharing options...
jc Posted November 19, 2008 Report Share Posted November 19, 2008 Anthony, Essa instrução que te passei precisa ser executada com a função SQLArray()... dessa forma, vc vai recuperar a linha com as informações para o Ãndice definido em "key_name".... caso não exista nada, se vier len() == 0, então é pq o Ãndice não existe para aquela tabela. Agora talvez a SQLLIB possua funções próprias para verificar se um determinado Ãndice já existe! Esse método que te passei, seria na forma crua... com SQL puro. citação:Quando efetuo ALERT(INDEX("SHOW INDEX FROM "+cTable+" WHERE Key_mame = "+aNameInd+"")) o retorno é sempre falso. citação:Anthony, Na verdade o SHOW INDEX vai te mostrar todos os Ãndices da tabela em questão, bem como a chave primária e outras informações. Com isso, através da função SQLArray(), vc fazer uma varredura para achar o Ãndice ou fazer dessa forma abaixo: id=code>id=code>-- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 id=quote>id=quote> id=quote>id=quote>-- Júlio César M. Ferreira www.rsconsultores.com.br Fone: (81) 4009.5444 Fax: (81) 4009.5400 E-mail: julio.mferreira@gmail.com MSN: julio_mferreira@hotmail.com Recife - PE FWh 8.08/ xHarbour 1.1.0/ xDevStudio 0.72/ SQL LIB 1.9/ Pelles 5.00.1 Quote Link to comment Share on other sites More sharing options...
siscat Posted November 21, 2008 Report Share Posted November 21, 2008 aormond, uma pergunta básica, qual RDD voce está usando para trabalhar com SQL?? Luisão, não é bem assim não!! citação:om, acredito (e acho que li em algum lugar) que o MySQL gerencie os Ãndices internamente para obter os melhores resultados. Por exemplo, nos sistemas que usam MySQL aqui, ao se fazer ORDER BY ou SELECTs usando a cláusula WHERE, sem estar com os campos indexados, tais querys demoravam séculos... id=quote>id=quote>o melhor método é uma analise dos dados da sua tabela identificando as consultas mais utilizadas e criar Ãndices com as colunas (simples ou compostas - dependendo do caso) isto otimiza o tamanho do banco de dados e não perde a performace!.. da forma que vc está fazendo o banco requer muito recurso de máquina para fazer a atualização de um registro numa situação de inclusão ou alteração de dados. Voce pode estar tendo resultado enquanto sua table é pequena ou com poucas colunas... más no momento que estiver com muitos registros seu sistema vai ficar muito lento e pesado e exigindo cada vez mais hardware para o servidor!.. []s.. Marllon Figueiredo Tecnologia de Sistemas siscat@siscat.com.br FWH+xHb+SQL+SQLRDD+xDevStudio Os desenvolvedores não podem viver sem estas ferramentas! Quote Link to comment Share on other sites More sharing options...
Anthony Ormond Posted November 21, 2008 Author Report Share Posted November 21, 2008 Muito Obrigado a todos, principalmente Marllon, Julio e Luisão. Deu certo, segue o que foi feito. aInd := SqlArray("SHOW INDEX FROM "+cTable+" WHERE Key_name = '"+cNameInd+"'") if Len(aInd) = 0 //retorna que não existe else // retorna que existe endif Quote Link to comment Share on other sites More sharing options...
Luisão Posted November 21, 2008 Report Share Posted November 21, 2008 Marllon, obrigado pela dica... Quando eu disse que o MySQL "gerencia" os Ãndices internamente, quis dizer que não precisamos por exemplo para procurar um certo registro usar um SET ORDER TO e DBSEEK como nos comandos nativos do Clipper... Passamos apenas a cláusula WHERE no comando sem especificar indices nem nada e ele se encarrega de utilizar os melhores Ãndices para a pesquisa... Quanto ao desempenho de se criar um Ãndice para cada coluna, na época que estava analisando como ficaria a criação dos Ãndices, achei que fosse a melhor solução para o momento e resolveu muito bem minha necessidade. Mas como você mesmo disse, com o tempo e com o aumento no volume de dados isso pode se tornar menos eficiente, mas por enquanto, a performance está muito boa até mesmo para tabelas muito grandes (+700.000 registros) Mas é assim que funciona, trocando informações, todos melhoramos! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.