Jump to content
Fivewin Brasil

indice mysql


Luiz Fernando

Recommended Posts

Colegas no meu sistema em mysql ainda não criei indice para as tabelas, o meu codigo esta 100% em sql,, minha duvida é a seguinte dentro do sistema é bom eu dar uma opção pro usuario de destruir os indice já existente e criar os mesmo novamente, ou é bobeira fazer isto, uma vez criado não preciso mais me preocupar com isto....

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Uma vez criado não precisa se preocupar, em mysql não tem essa história de ter que abrir o índice para ele ser atualizado

mas se quiser ter uma segurança, e inserir uma rotina para apenas criar/re criar caso algum doido apague algo, aí seria válido.

Vlw Erciley pela resposta, só para ver se eu entendi, tipo se já existe o indice criado, e eu mandar criar de novo sem apagar o mesmo com DROP não tera problema...

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Empresoft, tem que dar o drop antes sim. O banco não faz automatico. Em meu sistema tenho uma tela com um browse que permite as tabelas que seram criados os indices, isso para o caso de no decorrer do desenvolvimento você ir criando mais indices conforme achar necessário. Uma ideia é fazer uma função para automatizar a criação e já fazer o drop. Recomendo fortemente a rever suas tabelas e criar os indices o mais rapido possivel, porque tua aplicação vai decolar em termos de performance, principalmente se tiver base de dados grande. Se quiser posto o meu fonte de criação de indices.

Abraço.

Link to comment
Share on other sites

Eroni vlw pela resposta agora ficou bem claro, eu só coloquei este sistema em clientes novos por isto não tinha me preocupado ate então com os indice, mais no inicio do ano irei migrar meus cliente antigos dai preciso deixa pronto este esquema de indice...

Obs: colega sobre os fonte, se vc poder postar um exemplo de pelo menos uma tabela,,,

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Luiz, caso você mande criar o índice, com o mesmo nome, dará erro no sql.

Caso mande criar o índice DO MESMO CAMPO, dando nome diferente ao índice, não terá erro por parte do SQL, mas isso é errado, óbvio.

Quanto a índices no sistema:

É importantíssimo que você crie índices para "todas" suas tabelas, e tão importante quanto isso, é TODO WHERE QUE VOCÊ FIZER, fazer seguindo a ordem dos campos no índice, igual você faz em DBF, se não fizer isso, não tem sentido algum seus índices criados.

A diferença de performance é imperceptível dependendo o tamanho de suas tabelas,

mas pode ser MONSTRUOSA em outros casos, hehehe, ou seja, boa sexta-feira ^^

Link to comment
Share on other sites

Luiz, caso você mande criar o índice, com o mesmo nome, dará erro no sql.

É importantíssimo que você crie índices para "todas" suas tabelas, e tão importante quanto isso, é TODO WHERE QUE VOCÊ FIZER, fazer seguindo a ordem dos campos no índice, igual você faz em DBF, se não fizer isso, não tem sentido algum seus índices criados.

A diferença de performance é imperceptível dependendo o tamanho de suas tabelas,

mas pode ser MONSTRUOSA em outros casos, hehehe, ou seja, boa sexta-feira ^^

Colega mesmo nas tabelas pequena preciso criar indice, estava pensando em fazer só nas mais pesada, tipo tabela de cadastro de conta corrente, terá ai no máximo 5 registro, preciso criar indice mesmo assim...

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Você não precisa e creio que não sentirá diferença alguma, criando ou não, ou seja, não precisa....

mas é aquela história de boas práticas............ sempre é bom ter...... sempre tendo, nunca terá problemas, blablabla.

Fica a seu critério

imagine em um DBF de 5 registros..... você quer informação do registro CÓDIGO = 5, oq vc faz?

lAchou:=.F.
 
DBGOTOP()
WHILE !EOF()
   
   IF CODIGO == 5
      lAchou:=.T.
      EXIT      
   ENDIF
 
   DBSKIP(1)
ENDDO
 
IF lAchou
   ?'ACHOU, EBAAAAA'
ELSE
   ?'REGISTRO NÃO ENCONTRADO'
ENDIF
Imagino que no mysql seria a mesma coisa, ou seja, melhor ter doq não ter ^^
Link to comment
Share on other sites

Boa tarde, segue o meu fonte.

// Quando o usuario clicar Ok para iniciar , com o browse marcado......

For a := 1 to len( [ sua lista de tabelas, ou seu browse de tela ] )

CASE [ linha do seu browse ] == "tabela abc"

// Mensagem ao usuario tipo "aguarde, indexando a tabela abc..."

SWCreateIndex( [ linha do seu browse ], [Nome do indice no banco ], [nome do campo ] )

SWCreateIndex( [ linha do seu browse ], [Nome do indice no banco ], [nome do campo , nome do campo 2 ] )

// e assim sucessivamente, para varios indices da mesma tabela

next a // proxima tabela marcada

// etc, finalizar.

*******************************************************************************************
*******************************************************************************************
FUNCTION SWCreateIndex( cTable, cIndex, cKey )
LOCAL cDropIndex := ""

IF cTable = NIL .OR. cIndex == NIL .OR. cKey == NIL
RETURN( .F. )
ENDIF

cDropIndex := "DROP INDEX " + Upper( AllTrim( cIndex ) )
IF Upper( oSistema:cDbDriver_ ) == "MYSQL"
cDropIndex := "DROP INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) )
ENDIF

TRY

SWExecSql( cDropIndex,.F. )

SWExecSql( "CREATE INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) ) + " (" + Upper( AllTrim( cKey ) ) + ")",.F. )

CATCH

SWExecSql( "CREATE INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) ) + " (" + Upper( AllTrim( cKey ) ) + ")",.F. )

END

RETURN( .T. )

Desculpe se nao ta claro o suficiente, qualquer coisa é so pedir por email, ou skype.

Abraço.

Link to comment
Share on other sites

Maravilha Eroni ficou bem claro, vou criar o meu aqui usando mais ou menos a mesma logica do seu exemplo, só mais uma duvida, se um usuario for executar esta rotina num terminal, os demais terminais podem estar usando o sistema sem problema, ou é aconselhado ninguém estar usando o sistema durante este processo...

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Senhores,

Vendo este tópico, gostaria de fazer uma pergunta: Há realmente a necessidade de se recriar os índices em um banco SQL? Eu tenho trabalhado com bancos SQL desde 2009 e nunca vi a necessidade de se recriar índices, até porque quem gerencia isso é o próprio banco e não o nosso sistema, tal como fazemos em dbf.

Fica só a questão.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...